2)如果父进程要处理的事情很多,不能挂起,通过signal()函数人为处理信号SIGCHLD,只有在子进程退出自动调用制定好的回调函数,因为子进程结束后,父进程会收到信号SIGCHLD,可以在回调函数里面用wait或waitpid回收资源 。
#include <stdio.h>#include <unistd.h>#include <signal.h>#include<sys/types.h>#include<sys/wait.h>void sig_child(int signo){ pid_t pid; //处理僵尸进程,-1代表等待任意一个子进程,WNOHANG代表不阻塞 while((pid=waitpid(-1,NULL,WNOHANG))>0) {printf("孩子进程被杀死 %d\n",pid); }}int main(){pid_t pid;//创建捕捉子进程退出信号//只要子进程退出,触发SIGSIGCHLD,自动调用sig_child()signal(SIGCHLD,sig_child());//创建进程pid = fork();if(pid<0){perror("fork");exit(1);}else if(pid == 0){//子进程printf("我是子进程,pid id :%d.我正在退出\n",getpid());exit(0);}else if(pid>0){//父进程sleep(2);//保证子进程先运行printf("我是父亲,我正在退出\n");system("ps -ef|grep defunct");//查看有没有僵尸进程}return 0;}
运行结果:

文章插图
3)如果父进程不关心子进程时候结束,那么可以用signal(SIGCHLD,SIG_IGN)通知内核,自己对子进程的结束不感兴趣,父进程忽略此信号,那么子进程结束后,内核会回收,并不再给父进程发送信号 。
#include <stdio.h>#include <unistd.h>#include <signal.h>#include<sys/types.h>#include<sys/wait.h>int main(){pid_t pid;//忽略子进程退出信号的信号//那么子进程结束之后,内核会回收,并不再给父进程发送信号signal(SIGCHLD,SIG_IGN);//创建进程pid = fork();if(pid<0){perror("fork");exit(1);}else if(pid == 0){//子进程printf("我是子进程,pid id :%d.我正在退出\n",getpid());exit(0);}else if(pid>0){//父进程sleep(2);//保证子进程先运行printf("我是父亲,我正在退出\n");system("ps -ef|grep defunct");//查看有没有僵尸进程}return 0;}
运行结果:
文章插图
【二 Linux进程间通信】
经验总结扩展阅读
- 十二星座女生爱情的出发点是什么?
- 黑豆泡一晚上第二天煮可以吗
- 十二星座女没有那么喜欢你的一些行为
- 吃不完的白灼虾第二次怎么搞
- 二瓶啤酒要过多久才能不被测出来
- too同义词|too的同义词
- 2022年农历十一月十二适合乔迁吗
- 二 SpringCloud - Eureka注册中心,feign远程调用,hystrix降级和熔断
- 2022年腊月初二是阳历几月几号
- 2022年腊月初二日子吉利吗