因为学习php多进程要了解进程之间的通信,而进程之间的通信可以靠信号来实现,所以记一下linux的信号
使用kill -l 查看信号列表
信号解析
1) SIGHUP:该信号在用户终端链接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一session内的各个作业,这时他们与控制终端不再关联。此外,对于与终端脱离关系的守护进程,这个信号用于通知他重新读取配置文件
2)SIGINT:程序终止(interrupt)信号,用户在键入INTR字符串(ctrl-c)时发出,用于通知前台进程终止进程
3)SIGQUIT:和SIGINT类似,但由QUIT字符(ctrl-)来控制。进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号
4)SIGILL:执行了非法指令,通常是因为可执行文件本身出现错误,或者试图执行数据段。堆栈溢出时可能也会产生这个信号
5)SIGTRAP:由断点指令或其他trap指令产生,由 debugger使用
6)SIGABRT:调用abort函数生成的信号
7)SIGBUS:非法地址,包括内存地址对齐(alignment)。比如访问一个四个字长的整数,但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己的存储空间或只读存储空间)
8)SIGFPE:在发生致命的算术运算错误时发出。
9)SIGKILL:用来立即结束程序的运行。该信号不能被阻塞、处理和忽略。kill -9 pid
10) SIGUSR1:留给用户自己使用
11)SIGSEGV:试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据
12)SIGUSR2:留给用户使用
13)SIGPIPE:管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或意外终止就往管道写,写进程就会收到SIGPIPE信号。此外用socket通信的两个进程,写进程在写socket的时候,读进程已经终止。
14)SIGALRM:时钟定时信号,计算的是实际的时间或时钟时间。 alarm函数使用该信号。
15)SIGTERM:程序结束( terminate),与SIGKILL不同的是该信号可以被阻塞和处理。通常要求程序自己正常退出,kill pid <==>kill -15 pid
16)SIGSTKFLT:
17) SIGCHLD:子进程结束时,父进程会收到这个信号。如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程被称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHLD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init接管)
18)SIGCONT:让一个停止(stopped)的进程继续执行。该信号不能被阻塞。可以用一个hanndler来让程序在由stopped状态变为继续执行时完成特定的工作
19)SIGSTOP:停止(stopped)进程的执行。注意他和terminate以及interrupt的区别:该进程还未结束,只是暂停执行。该信号不能被阻塞,处理或忽略
20)SIGTSTP:停止进程的运行,。但该信号可以被处理和忽略。用户键入SUSP字符(ctrl-z)时发出该信号
21)SIGTTIN:当后台作业要从用户终端读数据时,该作业中的所有进程会受到SIGTTIN信号,缺省时这些进程会停止执行
22)SIGTTOU:类似于SIGTTIN,但在写终端(或修改终端模式)时收到
23)SIGURG:有"紧急"数据或out-of-band数据到达socket时产生
24)SIGXCPU:超过CPU时间资源限制,这个限制可以由getrlimit/setrlimit来读/写
25)SIGXFSZ:当进程企图扩大文件以至于超过文件大小资源限制
26)SIGVTALRM:虚拟时钟信号。类似于SIGALRM,但是计算的是该进程占用的CPU时间
27)SIGPROF:类似于SIGALRM/SIGVTALRM,但包括该进程用的CPU时间以及系统调用的时间
28)SIGWINCH:窗口大小改变时发出
29)SIGIO:文件描述符准备就绪,可以开始进行输入/输出操作
30) SIGPWR:Power failure
31) SIGSYS:非法的系统调用
在以上列出的信号中,程序不可捕获、阻塞或忽略的信号有:9)SIGKILL, 19)SIGSTOP
不能恢复至默认动作的信号有:4)SIGILL, 5)SIGTRAP
默认会导致进程流产的信号有:6)SIGABRT, 7)SIGBUS, 8)SIGFPE , 4)SIGILL , SIGIOT, 3)SIGQUIT, 11)SIGSEGV, 5)SIGTRAP , 24)SIGXCPU, 25)SIGXFSZ
默认会导致进程退出的信号有:14)SIGALRM, 1)SIGHUP, 2)SIGINT, 9)SIGKILL, 13)SIGPIPE, SIGPOLL, 27)SIGPROF, 31)SIGSYS, 15)SIGTERM, 10)SIGUSR1, 12)SIGUSR2, 26)SIGVTALRM
默认会导致进程停止的信号有:19)SIGSTOP, 20)SIGTSTP, 21)SIGTTIN, 22)SIGTTOU
默认进程忽略的信号有:17)SIGCHLD, 30)SIGPWR, 23)SIGURG, 28)SIGWINCH
信号的基本概念
1.基本概念
软中断信号(signal,又简称为信号)用来通知进程发生了异步时间。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据
收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:
-
类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理
-
忽略某个信号,对该信号不做任何处理,就像未发生过一样
-
对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止,进程通过系统调用signal来指定进程对某个信号的处理行为
在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。
2.信号的类型
发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:
-
与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号
-
与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域,或执行一个特权指令及其他各种硬件错误
-
与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽
-
与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。
-
在用户态下的进程发出的信号,如进程调用系统调用kill向其他进程发送信号
-
与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况
-
跟踪进程执行的信号