在这里结合进程信号的内容,复习一下僵尸进程形成的原因:
子进程先于父进程退出,子进程在退出的时候,会向父进程发送SIGCHLD信号,而SIGCHLD信号的处理方式为SIG_IGN忽略处理!导致了父进程没有回收子进程的退出状态信息,从而致使子进程变成了僵尸进程。
那么咱们就利用自定义函数和wait函数,修改SIGCHLD信号的处理方式,让父进程在子进程退出的时候可以回收其退出状态信息。
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<signal.h>
4 #include<sys/wait.h>
5
6 void sigcallback(int sig){
7 printf("sigcallback recv sig:%d\n",sig);
8 wait(NULL);
9 }
10
11 int main(){
12 //目的:解放父进程,让父进程创建子进程之后,还能执行父进程的代码逻辑 ;并且还能防止子进程变成僵尸进程。
13 //做法:
14 //将SIGCHLD信号的处理方式进行自定义
15 //在自定义函数当中调用wait/waitpid函数
16 //子进程退出之后会向父进程发送SIGCHLD信号,父进程回调自定义处理函数> ,从调用wait/waitpid函数,回收子进程的退出状态信息。
17
18 signal(SIGCHLD,sigcallback);//自定义处理SIGCHLD信号
19 pid_t ret = fork();//创建子进程
20 if(ret<0){
21 perror("fork");
22 return 0;
23 }else if(ret == 0){
24 //child
25 sleep(5);
26 printf("i am child\n");
27 }else{
28 //father
29 while(1){
30 printf("i am father , exec father process code\n");
31 sleep(1);
32 }
33 }
34 return 0;
35 }
运行结果分析:
17号信号就是SIGCHLD信号,被我们成功改写并且预防了僵尸进程的出现: