入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

SIGCHLD 信号

创建时间:2016-06-12 投稿人: 浏览次数:928

SIGCHID:


子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。


要想不产生僵尸进程还有另外一种办法:父进程调用sigaction将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。

代码:

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<signal.h>
  4 #include<sys/types.h>
  5 #include<wait.h>
  6 #include<unistd.h>
  7 #include<stdlib.h>
  8 void clear_pthread(int signal)
  9 {   
 10     int status=0;
 11     while(waitpid(-1,&status,WNOHANG))
 12     {   
 13         printf("sig:%d,code:%d
",status&0xff,(status>>8)&0xff);
 14     }
 15 
 16 }
 17 int main()
 18 {
 19 
 20     pid_t id=fork();
 21     if(id<0)
 22     {
 23         perror("failure");
 24         exit(1);
 25     }
 26     else if(id==0)
 27     {
 28         sleep(10);
 29         printf("this is a child process
");
 30         exit(1);
 31     }
 32     else if(id>0)
 33     {   
 34         while(1)
 35         {
 36           signal(SIGCHLD,clear_pthread);
 37         }
 38      
 39 
 40     }
 41     return 0;
 42 }   

 结果:
[admin@www SIGNAL]$ gcc -o sigchld sigchld.c
[admin@www SIGNAL]$ ./sigchld
this is a child process
sig:0,code:1
^C


本文出自 “liveyoung” 博客,转载请与作者联系!

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。