信号在linux系统占有很重的地位,在bash shell中我们都在不知道不觉得用到信号的知识。比如kill -9 122345,杀死122345这个进程,从这个案例中也可以看出信号是以进程为单位,进程负责发送信号及接收信号。
在学习信号的过程中,我一直有个问题,如果父进程不向子进程发送退出信号时,父进程的退出并不会引起子进程也退出。但确实PHP的fork后,父进程退出子进程跟着也退出了,我猜想这很有可能是是PHP已经封装了父进程退出就向子进程发送信号要求子进程退出。这个问题就引起如何去杀死父进程后子进程也退出?首先每个进程都属于一个进程组,父进程一般是这个进程组的组长,pid也是这个进程组的组ID,kill -9 -122345时就表示向这个进程发着SIGKILL信号。所有进程将退出系统。
信号在linux C编程中的实现也非常的简单,先看看信号表示:
| 号码 | 名字 | 默认行为(这里面说的是默认行为,你可以重写这个行为) |
| 1 | SIGHUP | 终止(失去终端控制权) |
| 2 | SIGINT | 键盘终止(CTRL+C) |
| 3 | SIGQUIT | 键盘退出(CTRL+Z) |
| 4 | SIGIL | 终止(非法指令) |
| 5 | SIGTRAP | 终止并dump core(跟踪陷阱) |
| 6 | SIGABRT | 终止并dump core(来自abort 函数的终止信号) |
| 7 | SIGBUS | 终止(总线错误) |
| 8 | SIGPFE | 终止并dump core(浮点异常) |
| 9 | SIGKILL | 终止(杀死程序) |
| 10 | SIGUSR1 | 终止(用户自定义) |
| 11 | SIGSEGV | 终止并dump core(引用无效存储器) |
| 12 | SIGUSR2 | 用户自定义的信号2 |
| 13 | SIGPIPE | 向一个没有读用户的管道做写操作 |
| 14 | SIGALRM | 来自alarm函数的定时器信号 |
| 15 | SIGTERM | 软件终止信号 |
| 16 | SIGSTKFLT | 协处理器上的栈故障 |
| 17 | SIGCCHLD | 忽略(一个子进程终止或暂停) |
| 18 | SIGCONT | 忽略(继续进程如果该进程停止) |
| 19 | SIGSTOP | 停止直到下一个SIGCONT(不来自终端暂停信号) |
| 20 | SIGTSTP | 停止直到下一个SIGCONT(自终端暂停信号) |
| 21 | SIGTTIN | 停止直到下一个SIGCONT(后台进程读终端) |
| 22 | SIGTTOU | 停止直到下一个SIGCONT(后台进程向终端写) |
| 23 | SIGURG | 忽略(套接字上的紧急情况) |
| 24 | SIGXCPU | 终止(CPU时间限制超出) |
| 25 | SIGXFSZ | 终止(文件大小限制超出) |
| 26 | SIGVTALRM | 终止(虚拟定时器期满) |
| 27 | SIGPROF | 终止(剖析定时器期满) |
| 28 | SIGWINCH | 忽略(窗口大小变化) |
| 29 | SIGIO | 终止(在某个描述符上可执行IO操作) |
| 30 | SIGPWR | 终止(电源故障) |

