Linux SIGCHLD信号

  1. 在子进程结束之后,会默认给父进程发送SIGCHLD信号。

有以下代码:

Linux SIGCHLD信号_第1张图片

编译并运行以上代码:

Linux SIGCHLD信号_第2张图片
可以看到在子进程结束之后,将SIGCHLD信号发送给了父进程,然后输出SIGCHLD信号的代号17。

在后台运行以上代码并查看进程信息,可以看到子进程结束后变成了僵死进程:

Linux SIGCHLD信号_第3张图片

  1. 通过SIGCHLD信号解决僵死进程

第一种方法:

代码如下:

Linux SIGCHLD信号_第4张图片

在后台编译并运行,并且查看进程信息:

Linux SIGCHLD信号_第5张图片
可以看到子进程结束之后直接消失,并没有产生僵死进程。

第二种方法:

代码如下:

Linux SIGCHLD信号_第6张图片
代码分析:

第10行的signal(SIGCHLD,SIG_IGN;),实际上就是忽略了子进程的信号SIGCHLD,就相当于间接的告诉内核不想知道子进程的退出码,所以子进程结束之后,直接就将子进程消灭掉,不需要保留子进程的PCB去获取它的退出码。signal(SIGCHLD,SIG_IGN;)在Unix系统上不可行,仅在Linux系统上可行。

在后台编译并运行,并且查看进程信息:

Linux SIGCHLD信号_第7张图片

可以看到子进程结束后并没有变成僵死进程,而是直接消失了。

你可能感兴趣的:(Linux,linux,运维,服务器)