linux信号机制

部分引用于:

https://blog.youkuaiyun.com/baobao8505/article/details/1115820

 

大纲:

信号概念

基本属性

信号四要素

产生信号五种

kill函数

alarm函数

setitimer函数  是alarm进化版 可以精确定时

信号集操作函数

信号屏蔽字

未决信号集

信号的捕捉

注册信号捕捉函数

sigaction函数(重点)

 

信号的机制:

信号原理类似时钟中断。A给B发送信号,当B收到信号之后,不管执行到什么位置,都要暂停去处理信号,处理完毕再去继续执行,与硬件中断类似,异步模式,但是信号是软件层面上的中断,早期常被叫做软中断,所有具有很强的延时性,对于用户来说这个延时时间很短暂,不易察觉。

每个进程收到的所有信号,都是由内核负责发送的,内核处理。

信号机制示意图:

机制示例,比如当一个按键触发,信号会发送出去,比如这个信号标记是2,当程序收到这个信号的时候,那么未决信号集2的信号就会从0变为1,当这个信号处理完成之后,又会从1变为0。

但是当这个按键信号发生阻塞的时候,阻塞信号集2就会从0变为1,并且会影响到未决信号集2也从0变为1,当信号执行时,阻塞信号集2变为0,未决信号集2不变,当信号处理完之后,未决信号集2又从1变为0。

还有一种情况,当信号5被屏蔽了,但是并不存在这个5信号,所以就不会影响未决信号5,毕竟信号5并不存在。

信号处理方式:

1.默认

2.忽略 丢弃(并不是把信号丢弃,而是该信号是丢弃信号,忽略信号)

3.捕捉(调用户处理函数)

Linux 内核的进程控制块 PCB是一个结构体,task_struct 除了包含进程id,状态,工作目录,用户id,组id,文件描述符表,还包含了信号相关的信息,主要值得是 未决信号集 跟 阻塞信号集。

阻塞信号集:将某些信号加入集合,并对他们设置屏蔽,当屏蔽x信号后,再收到该信号,该信号的处理将推后(接触屏蔽后)

未决信号集:1.信号产生,未决信号集中描述该信号的位立刻翻转为1,表信号处于未决状态。当信号被处理对应位置翻转为0,这一刻往往非常短暂。

2.信号产生后由于某些原因(主要是阻塞)不能抵达。这类信号的的集合称之为未决信号集。

信号的编号:

linux 下 kill -l 查看

1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    

不存在为0的信号,1-31号信号称为常规信号(也叫普通信号,标准信号),34-64为实时信号,驱动编程与硬件相关。

信号四要素:

与变量三要素类似的,每个信号也必备四要素:

1 编号  2名称   3 事件  4 默认处理动作

可以通过man 7 signal 查看,也可以到 /usr文件下 include文件里找到 signal.h文件查看。

部分信号描述如下:

        Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process

       SIGINT        2       Term    Interrupt from keyboard
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating point exception
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                     readers
       SIGALRM      14       Term    Timer signal from alarm(2)
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25    Cont    Continue if stopped
       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at terminal
       SIGTTIN   21,21,26    Stop    Terminal input for background process
       SIGTTOU   22,22,27    Stop    Terminal output for background process

       The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
value 值有 1个值 三个值的,只有中间两个是linux x86值,其余两个一个是alhpa  另一个是sparc的 

信号 对照表:

1) SIGHUP :当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作问终止进程。

2) SIGINT:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。

3) SIGQUIT:当用户按下<ctr+\>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信号。默认动作为终止进程。

4) SIGILL: CPU 检测到某进程执行了非法指令。默认动作为终止进程并产生core文件

5) SIGTRAP:该信号由断点指令或其他trap指令产生。默认动作为终止里程并产生core文件。

6) SIGABRT:调用abort函数生成的信号。默认动作为终止进程并产生core文件。

7) SIGBUS: 非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件。

8) SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。默认动作为终止进程并产生core 文件。

9) SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可以杀死任何进程的方法。

10) SIGUSR1:用户定义的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。

11) SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生core文件。

12) SIGUSR2:另外一个用户自定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程。

13) SIGPIPE:Broken pipe向-个没有读端的管道写数据。默认动作为终止进程。

14) SIGALRM:定时器超时,超时的时间由系统调用alarm设置。默认动作为终止进程。

15) SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行shell命令Kill时,缺省产生这个信号,默认动作为终止进程。

16) SIGSTKFLT: Linux 早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程。

17) SIGCHLD:子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号。

18) SIGCONT:如果进程己停止,则使其继续运行。默认动作为继续/忽略。

19) SIGSTOP:停止进程的执行。信号不能被忽路,处理和阻塞。默认动作为暂停进程。

20) SIGTSTP:停止终端交互进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。

21) SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。

22) SIGTTOU:该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。

23) SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据到达,默认动作为忽略该信号。

24) SIGXCPU:进程执行时间超过了分配给该进程的CPU时间,系统产生该信号并发送给该进程。默认动作为终止进程。

25) SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。

26) SIGVTALRM:虛拟时钟超时时产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默认动作为终止进程。

27) SIGPROF:类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

28) SIGWINCH:窗口大小改变时发出,默认动作为忽略该信号。

29) SIGIO:此信号向进程指示发出了一个异步IO事件,默认动作为忽略。

30) SIGPWR:关机,默认动作为终止进程。

31) SIGSYS:非法的系统调用。默认动作为终止进程并产生core文件。

特别强调 9)SIGKILL  和 19)SIGSTOP信号 ,不允许忽略和捕捉,只能执行默认动作。甚至不能将其设置为阻塞。

在以上列出的信号中,程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP
不能恢复至默认动作的信号有:SIGILL,SIGTRAP
默认会导致进程流产的信号有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默认会导致进程退出的信号有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默认会导致进程停止的信号有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默认进程忽略的信号有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH

此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在进程挂起时是继续,否则是忽略,不能被阻塞。 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值