linux系统下,进程对信号的默认响应方式有5种:
1) 忽略信号,即当做没收到信号一样;
2) 终止进程;
3) 产生核心转储文件,同时进程终止;
4) 停止进程,即暂停进程的执行;
5) 于之前的暂停之后恢复执行;
处理方式2和3都会导致进程终止执行并立即退出,处理方式1、4、5不会造成进程终止执行。因此,可以将信号粗略的分为两类,一类是会导致进程终止并退出的信号;另一类则是不会导致进程终止并退出的信号。
信号 命令/操作 默认行为 相应事件 退出码(信号编号+128) 信号编号
SIGKILL kill -9 pid 终止 杀死进程 137 9
SIGTERM killall pname 终止 软件终止信号
SIGINT ctrl + c 终止 来自键盘的终止
SIGTSTP ctrl + z 停止直到下一个SIGCONT 来自终端的停止信号
SIGSTOP 停止直到下一个SIGCONT 不是来自终端的停止信号
SIGSEGV 终止并转储内存 无效的内存引用
SIGCHLD 忽略 一个子进程终止或停止
SIGALRM 终止 alarm 函数的定时器信号
SIGUSER1 终止 用户定义的信号1
SIGUSER2 终止 用户定义的信号2
SIGFPE 终止并转储内存 浮点异常, 除以0
SIGILL 终止 非法指令
SIGSTOP、SIGKILL是两个不能捕捉的信号或忽略的信号, 其它信号可以通过signal 函数修改默认的行为
The default signal for kill is SIGTERM
$ 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
说明:
只有第9种信号(SIGKILL)才可以无条件终止进程,SIGKILL信号进程无法捕获,进程也不得不无条件终止,其他信号进程都有权利忽略
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
CHLD 17 父进程或init进程进行收拾僵尸进程用到的信号
当进程因收到信号被终止执行退出后,父进程可以通过调用wait或waitpid得到它的exit code。进程被各信号终止的退出状态码总结如下
1. 有可能它的退出状态码是信号编号+128,比如SIGQUIT信号,它的编号为3,进程收到该信号后会core dump,退出状态码为3+128=131;
比如kill -15 cpid 父进程收到的退出码是143
kill -9 137