并发处理时防止产生僵尸进程

来源:互联网 发布:淘宝企业店铺运营 编辑:程序博客网 时间:2024/06/18 16:41
 

死进程,同时内核会向其父进程发送SIGCHLD(或SIGCLD)信号。此时要分几种情况:  
            1、父进程处理SIGCHLD信号,调用wait,僵死进程消失。这样我们就看不到僵尸进程。  
            2、父进程忽略SIGCHLD信号,随着子进程不断产生、结束,僵死进程的数目不断增加,导致影响系统速度及其他一些问题。  
          不需长期运行的程序,即使产生子进程也不会导致大量僵死进程存在。因为,父进程退出时,其产生的子进城成为“孤儿“进程,由init(1号进程)进程接管,init进程在子进程退出时会处理SIGCHLD信号,给子进程“收尸“。  

/**
 * A handler, which is called on child proccess exit.
 */
void sig_chld_handler(void) {
 //other proccess
 while (waitpid(-1, NULL, WNOHANG) > 0);
}

 #ifdef __USE_GNU
  signal(SIGCHLD, (sighandler_t )sig_chld_handler);
 #endif
 #ifdef __USE_BSD
  signal(SIGCHLD, (sig_t )sig_chld_handler);
 #endif
signal返回值: 返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。
SIGCHLD 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽

下面的情况可以产生Signal:  

 1. 按下CTRL+C产生SIGINT  

 2. 硬件中断,如除0,非法内存访问(SIGSEV)等等  

 3. Kill函数可以对进程发送Signal  

 4. Kill命令。实际上是对Kill函数的一个包装

 5. 软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等

原创粉丝点击