部分引用于:
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 processSIGINT 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 processThe 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在进程挂起时是继续,否则是忽略,不能被阻塞。