signal(SIGCLD,SIG_IGN)

遇到信号量的问题?函数

 signal(SIGCLD,SIG_IGN)进程

SIGCHLD的语义为:子进程状态改变后产生此信号,父进程须要调用一个wait函数以肯定发生了什么。it

 对于SIGCLD的早期处理方式以下:若是进程特意设置该信号的配置为SIG_IGN,则调用进程的子进程将不产生僵死进程。配置

 若是将SIGCLD的配置设置为捕捉,则内核当即检查是否有子进程准备好被等待,若是是这样,则调用SIGCLD处理程序。循环

APUE上SIGCLD语义写的有点不清楚,到底咱们的系统是如何来处理SIGCLD信号呢?
    1.SIG_DFL :默认的处理方式是不理会这个信号,可是也不会丢弃子进行状态,因此若是不用wait,waitpid程序

对其子进行进行状态信息回收,会产生僵尸进程。
    2.SIG_IGN :忽略的处理方式,这个方式和默认的忽略是不同的语意,暂且咱们把忽略定义为SIG_IGN,阻塞

在这种方式下,子进程状态信息会被丢弃,也就是自动回收了,因此不会产生僵尸进程,可是问题也就来了,内核

wait,waitpid却没法捕捉到子进程状态信息了,若是你随后调用了wait,那么会阻塞到全部的子进程结束,并返错误

回错误ECHILD,也就是没有子进程等待。
       APUE中P248叙述SIGCHLD若是配置成SIG_IGN也不会产生僵尸进程。是否系统SIG_IGN配置下,对漏洞

SIGCLD,SIGCHLD作出的处理方式是相同的。
   3.自定义处理方式:SIGCLD会当即检查是否有子进程准好被等待,这即是SIGCLD最大漏洞了,一旦在信号

处理函数中加入了信号处理方式重建的步骤,那么每次设置SIGCLD处理方式时,都会去检查是否有信号到来,

若是此时信号的确到来了,先是调用自定义信号处理函数,而后是调用信号处理方式重建函数,在重建配置的

时候,会去检查信号是否到来,此时信号未被处理,会再次触发自定义信号处理函数,一直循环。

    因此在处理SIGCLD时,应该先wait处理掉了信号信息后,再进行信号处理方式重建。

   SIGCHLD在配置信号处理方式时,是不会当即检查是否有子进程准备好被扽带,也不会在此时调用信号处理函数。

相关文章
相关标签/搜索