1.信号又称软中断
2.信号的发送
1)一个进程发送给另一个进程(或自身)
2)内核发给进程
3.不可被捕捉、不能忽略的信号:SIGKILL、SIGSTOP
4.信号处理函数执行期间,后续递交的相同信号将被阻塞;另外还可以通过在调用sigaction函数时设置sa_mask参数的值指定其它被阻塞的信号,如,将其设置为0则表示只阻塞相同信号
5.承上,如果在阻塞期间,一个信号被阻塞了多次,在阻塞解除后,该信号只被递交一次,也就是说POSIX信号不提供排队机制
6.EINTR:如果进程阻塞于某个系统调用(如accept)时,有信号到达,且进程捕获并处理了这个信号,那么当前的系统调用将被中断(被信号中断)而返回EINTR,一般内核对于被中断的系统调用的处理是:处理完信号后重启系统调用。但是并非所有的内核都会自动重启被中断的系统调用,因此我们需要对系统调用出错返回的EINTR进行特殊处理(一般为再次调用该系统调用,以达到与内核自动重启被中断的系统调用相同的效果)。但是connect函数是一个例外,它一旦返回EINTR就不能被再次调用
7.我们把系统调用分为两类:低速系统调用和其它系统调用;被中断的系统调用一般为低速系统调用,它们是可能使进程永远阻塞的系统调用,如accept、read、write等
8.fork一个子进程时,父进程中的信号处理函数在子进程中继续有效;但是如果子进程调用exec执行另一个程序,那么信号处理函数在这个新程序中将不再有效,因为信号处理函数的地址对新程序来说已经变得没有意义
9.不可重入函数:信号处理函数不能调用的函数
1)修改全局/静态存储区数据的函数,如I/O函数
2)使用malloc/free的函数,因为它们通常会在静态/全局存储区维护一个链表,并会去修改它
10.信号处理函数一般应在调用开始保存errno的副本,并在结束时恢复这个值;因为一个线程只有一个errno,信号处理函数执行过程中可能会修改这个值,即使它只调用可重入函数
11.kill将信号发送给进程或者进程组,raise则允许进程将信号发送给自己
12.unix系统关机时,由init进程给所有进程发送SIGTERM信号,该信号可捕捉,因此进程可以在捕获到SIGTERM信号后做一些清理回收工作;在等待一段时间后(一般为5到20秒),init再给所有进程发送SIGKILL信号,该信号不可捕捉,进程将全部被该信号终止。
2.信号的发送
3.不可被捕捉、不能忽略的信号:SIGKILL、SIGSTOP
4.信号处理函数执行期间,后续递交的相同信号将被阻塞;另外还可以通过在调用sigaction函数时设置sa_mask参数的值指定其它被阻塞的信号,如,将其设置为0则表示只阻塞相同信号
5.承上,如果在阻塞期间,一个信号被阻塞了多次,在阻塞解除后,该信号只被递交一次,也就是说POSIX信号不提供排队机制
6.EINTR:如果进程阻塞于某个系统调用(如accept)时,有信号到达,且进程捕获并处理了这个信号,那么当前的系统调用将被中断(被信号中断)而返回EINTR,一般内核对于被中断的系统调用的处理是:处理完信号后重启系统调用。但是并非所有的内核都会自动重启被中断的系统调用,因此我们需要对系统调用出错返回的EINTR进行特殊处理(一般为再次调用该系统调用,以达到与内核自动重启被中断的系统调用相同的效果)。但是connect函数是一个例外,它一旦返回EINTR就不能被再次调用
7.我们把系统调用分为两类:低速系统调用和其它系统调用;被中断的系统调用一般为低速系统调用,它们是可能使进程永远阻塞的系统调用,如accept、read、write等
8.fork一个子进程时,父进程中的信号处理函数在子进程中继续有效;但是如果子进程调用exec执行另一个程序,那么信号处理函数在这个新程序中将不再有效,因为信号处理函数的地址对新程序来说已经变得没有意义
9.不可重入函数:信号处理函数不能调用的函数
10.信号处理函数一般应在调用开始保存errno的副本,并在结束时恢复这个值;因为一个线程只有一个errno,信号处理函数执行过程中可能会修改这个值,即使它只调用可重入函数
11.kill将信号发送给进程或者进程组,raise则允许进程将信号发送给自己
12.unix系统关机时,由init进程给所有进程发送SIGTERM信号,该信号可捕捉,因此进程可以在捕获到SIGTERM信号后做一些清理回收工作;在等待一段时间后(一般为5到20秒),init再给所有进程发送SIGKILL信号,该信号不可捕捉,进程将全部被该信号终止。