本文主要讲解常见信号的处理方式。
Sighup:终端关闭时,发送给此会话的所有进程组。Setsid成功后不再属于该会话,收不到该消息。
Sigterm: kill process_id时产生。
Sigpipe:向一个写端关闭的管道写数据,第二次写时会收到。
一般来说,Sigtstp、sigttou、sigttin、Sighup、sigpipe sigchld可以忽略,而响应sigusr1 sigusr2 sigterm 。
多线程信号响应方式
1、每个进程都有自己的信号掩码、信号处理函数。
2、同一进程中线程接收信号的行为:(1)异常产生的信号(比如程序错误,像SIGPIPE、SIGEGV这些),则只有产生异常的线程收到并处理。(2)pthread_kill产生的内部信号,则只有pthread_kill参数中指定的目标线程收到并处理。(3)外部使用kill命令产生的信号,通常是SIGINT、SIGHUP等job control信号,则会遍历所有线程,直到找到一个不阻塞该信号的线程,然后调用它来处理。(一般从主线程找起),注意只有一个线程能收到。
3、线程掩码、信号处理行为:每个线程都有自己独立的signal mask,但所有线程共享进程的signal action。这意味着,你可以在线程中调用pthread_sigmask(不是sigmask)来决定本线程阻塞哪些信号。但你不能调用sigaction来指定单个线程的信号处理方式。如果在某个线程中调用了sigaction处理某个信号,那么这个进程中的未阻塞这个信号的线程在收到这个信号都会按同一种方式处理这个信号。另外,注意子线程的mask是会从主线程继承而来的。