二 Linux进程间通信( 八 )


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;}运行结果:

二 Linux进程间通信

文章插图
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进程间通信

文章插图
【二 Linux进程间通信】

经验总结扩展阅读