参考
Linux信号(signal) 机制分析
SIGSEGV 和 SIGBUS & gdb看汇编
信号
信号是软件中断,很多比较重要的应用程序都需处理信号.信号提供了一种处理异步事件的方法,例如,终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序.
常见信号
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
信号的分类
前32种信号表示非实时信号,是不可靠的,信号不能排队,可能丢失
不知道为什么kill列出的信号没有32的值,但在signal.h中是SIGRTMIN=32
#define SIGRTMIN 32
后32个信号表示实时信号,是可靠的,支持排队
SIGHUP
如果终端接口检测到一个连接断开,则将此信号送给与该终端相关的控制进程(会话首进程)。此信号被送给session结构中s_leader字段所指向的进程。仅当终端的CLOCAL标志没有设置时,在上述条件下才产生此信号。(详情以后研究)
接到此信号的会话首进程也可能在后台,这区别与由终端正常产生的几个信号(中断,退出和挂起),这些信号总是传递给前台进程组中的每一个进程
如果会话首进程终止,也产生此信号。在这种情况下,此信号送给前台进程组中的每一个进程。
通常用此信号通知守护进程再次读取他们的配置文件。选用SIGHUP的理由是,守护进程不会有控制终端,通常绝不会收到此种信号。
SIGINT
当用户按中断键(一般采用DELETE/CRTL+C)时,终端驱动程序产生此信号并发送至前台进程组中的每一个进程。当一个进程在运行时失控,特别是它正在屏幕上产生大量不需要的输出时,常用此信号终止它。对后台进程不起作用
SIGQUIT
当用户在终端上按退出键(一般采用CTRL+)时,中断驱动程序产生此信号,并发送给前台进程组的所有进程。此信号不仅终止前台进程组(如SIGINT所作的那样),同时产生一个core文件。对后台进程不起作用
SIGILL
此信号表示进程已执行一条非法硬件指令。
SIGTRAP
表示一个实现定义的硬件故障
此信号名来自于PDP-11的TRAP指令。当执行断点指令时,实现常用此信号将控制转移至调试程序。
gdb有时候会产生此信号,后续研究
SIGABRT
调用abort(英 /əˈbɔːt/ )函数产生此信号,进程异常终止
SIGBUS
表示一个实现定义的硬件故障。当出现某些类型的内存故障时,实现常常产生此信号。
所述SIGBUS信号被发送到时它会导致一流程总线错误。导致发送信号的条件是例如错误的内存访问对齐或不存在的物理地址。
SIGALRM
在POSIX兼容的平台上,SIGALRM是在定时器终止时发送给进程的信号。它们的符号常量在头文件signal.h中定义。在不同的平台上,信号的编号可能发生变化,因此需要使用符号名称。
SIGCHLD
当某一子进程结束、中断或恢复执行时,内核会发送SIGCHLD信号予其父进程。在默认情况下,父进程会以SIG_IGN函数忽略之
SIGFPE
在POSIX兼容的平台上,SIGFPE是当一个进程执行了一个错误的算术操作(除0,浮点溢出)时发送给它的信号。SIGFPE的符号常量在头文件signal.h中定义。因为在不同平台上,信号数字可能变化,因此常使用信号名称
SIGIO and SIGPOLL
当在明确监视的文件描述符上发生事件时,将发送SIGPOLL信号。[14]有效使用它会导致发出异步I / O请求,因为内核将轮询描述符代替调用者。它提供了主动轮询的替代方法。
SIGPIPE
SIGPIPE信号在尝试写入管道而没有另一端连接进程时将其发送到进程。
SIGSEGV
如果进程尝试访问其虚拟地址空间之外的内存地址,则内核将通过SIGSEGV信号将该冲突通知进程
SIGKILL
SIGKILL信号被发送到一个进程,以使其立即终止(kill)。与SIGTERM和SIGINT相比,此信号无法捕获或忽略,并且接收过程在接收到此信号后无法执行任何清理。下列例外情况适用:
- 僵尸进程无法被杀死,因为它们已经死亡并且正在等待其父进程获得它们。
- 处于阻塞状态的进程只有在再次唤醒后才会消失。
- 在初始化过程是特殊的:它没有得到信号,它不希望处理,因此可以忽略SIGKILL。[10]从这个规则的一个例外是当init的ptraced在Linux上。[11] [12]
- 一个不可中断睡眠过程中不得终止(并释放其资源)发送SIGKILL也是如此。这是为解决临时软件问题而必须重新引导UNIX系统的少数情况之一。
如果在大多数系统关闭过程中终止进程,并且没有响应SIGTERM而自动退出,则SIGKILL将用作最后的手段。为了加快计算机关闭过程的速度,Mac OS X 10.6(也称为Snow Leopard)会将SIGKILL发送给标记为“干净”的应用程序,从而缩短了关闭时间,并且没有不良影响。[13]该命令killall -9在Linux中执行时具有类似的危险效果。它不允许程序保存未保存的数据。它具有其他选择,并且没有其他选择使用更安全的SIGTERM信号。
SIGTERM
SIGTERM信号被发送到进程以请求终止。与SIGKILL信号不同,该信号可以被过程捕获,解释或忽略。这允许进程执行适当的终止,以释放资源并在适当时保存状态。SIGINT与SIGTERM几乎相同。
SIGSTOP
作业控制信号,停止一个进程,不能被捕捉或忽略
SIGTRAP
发生异常(或陷阱)时,将SIGTRAP信号发送到进程:调试器已要求通知的条件-例如,当执行特定功能时,或当特定变量更改值时。
当执行断点指令时,实现常用此信号将控制转移到调试程序
SIGURG
当套接字具有可读取的紧急或带外数据时,将SIGURG信号发送到进程。
SIGUSR1 and SIGUSR2
SIGUSR1和SIGUSR2信号被发送到进程以指示用户定义的条件。
信号处理函数
Fake signal functions
1 | /* Fake signal functions. */ |
signal
1 | /* Type of a signal handler. */ |
DEMO
1 |
|
[root@localhost signal]# kill -USR1 16747
[root@localhost signal]# recv SIGUSR1
^C
[root@localhost signal]# kill -USR2 16747
[root@localhost signal]# recv SIGUSR2
^C
sigaction
sigemptyset
1 | //sigemptyset() initializes the signal set given by set to empty, with all signals excluded from the set. |
sigfillset
1 |
|
sigaddset/sigdelset
1 | //sigaddset() and sigdelset() add and delete respectively signal signum from set. |
sigismember
1 |
|