- 在子进程结束之后,会默认给父进程发送SIGCHLD信号。
有以下代码:
编译并运行以上代码:
可以看到在子进程结束之后,将SIGCHLD信号发送给了父进程,然后输出SIGCHLD信号的代号17。
在后台运行以上代码并查看进程信息,可以看到子进程结束后变成了僵死进程:
- 通过SIGCHLD信号解决僵死进程
第一种方法:
代码如下:
在后台编译并运行,并且查看进程信息:
可以看到子进程结束之后直接消失,并没有产生僵死进程。
第二种方法:
代码如下:
代码分析:
第10行的signal(SIGCHLD,SIG_IGN;)
,实际上就是忽略了子进程的信号SIGCHLD,就相当于间接的告诉内核不想知道子进程的退出码,所以子进程结束之后,直接就将子进程消灭掉,不需要保留子进程的PCB去获取它的退出码。signal(SIGCHLD,SIG_IGN;)
在Unix系统上不可行,仅在Linux系统上可行。
在后台编译并运行,并且查看进程信息:
可以看到子进程结束后并没有变成僵死进程,而是直接消失了。