SIGCHLD 信号

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\n",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\n");
 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 }   

 结果:
[[email protected] SIGNAL]$ gcc -o sigchld sigchld.c
[[email protected] SIGNAL]$ ./sigchld
this is a child process
sig:0,code:1
^C
时间: 2024-10-26 22:32:50

SIGCHLD 信号的相关文章

unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理

第五章中,有一个例子模拟客户端并发的终止TCP连接,服务器捕捉并处理SIGCHLD信号并调用waitpid函数防止僵死进程的出现.信号处理函数中核心的一句是: 1 while ( (pid = waitpid(-1, &statloc, WNOHANG)) > 0 ) 2 { 3 printf("wait child pid:%ld\n",(long)pid); 4 } 这是在使用wait函数时不能解决N个子进程同时终止时导致只有1个子进程被wait而其他N-1个子进程变

SIGCHLD信号

SIGCHLD的产生条件 1.子进程终止时 2.子进程接收到SIGSTOP信号停止时 3.子进程处在停止态,接受到SIGCONT后唤醒时 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <errno.h> 5 #include <sys/types.h> 6 #include <sys/wait.h> 7 #include <

关于SIGCHLD 信号

1.关于SIGCHLD 信号 wait 和 waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以阻塞地查询是否有进程结束等待清理(也就是轮询的方式).采用第一种方式,父进程阻塞就不能处理自己的工作了.采用第二种方式,父进程在处理自己的工作时还记得时不时轮询一下,程序实现复杂.其实子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理是忽略.父进程可以子定义SIGCHLD函数,这样父进程只需专心的处理自己的工作,不必关心子进程了.子进程终止时会通知父进程,父进程在信号处理函

[转] linux下的僵尸进程处理SIGCHLD信号

什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些 信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息. 而僵尸进程就是指:一个进程执行了exit系统调用退出,而其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态)的进程. 任何一个子进程(init除外)在exit后并非马上就消失,而是

linux下的僵尸进程处理SIGCHLD信号

什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息. 而僵尸进程就是指:一个进程执行了exit系统调用退出,而其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态)的进程. 任何一个子进程(init除外)在exit后并非马上就消失,而是留

waitpid和SIGCHLD信号回收僵尸进程

对于多进程而言,父进程一般需要跟踪子进程的退出状态.因此当子进程结束运行时,内核不会立即释放该进程的进程表的表项.以满足父进程后续对子进程退出的信息查询(死后验尸),当然前提是父进程还在运行.在子进程结束之后,父进程读取其退出状态之前,我们称该子进程处于僵尸态(用户空间已经被释放,其不能被调度). 先介绍两个系统调用函数: #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status);// wait是一个阻

(转载)linux下的僵尸进程处理SIGCHLD信号Linux环境进程间通信(五): 共享内存(下)

Linux环境进程间通信(五): 共享内存(下) 在共享内存(上)中,主要围绕着系统调用mmap()进行讨论的,本部分将讨论系统V共享内存,并通过实验结果对比来阐述两者的异同.系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面. 系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内

2次使用fork避免产生僵尸进程和不去处理SIGCHLD信号

1.如下代码所示 #include <unistd.h> #include <sys/types.h> #include <unistd.h> int main(int argc,char *argv[]) { pid_t child = fork(); if( child == -1 ) { //error printf("\nfork child error."); exit(0); } else if(child == 0){ //exit(0

僵进程与SIGCHLD信号

参考: https://www.cnblogs.com/webor2006/p/4014586.html wait()和waitpid()的参数解析:https://blog.csdn.net/csdn_kou/article/details/81091191 原文地址:https://www.cnblogs.com/Malphite/p/11703583.html