SIGCHILD信号
产生SIGCHLD信号的条件
- 子进程结束的时候
- 子进程收到SIGSTOP信号
- 当子进程停止时,收到SIGCONT信号
SIGCHLD信号的作用
子进程退出后,内核会给它的父进程发送SIGCHLD信号,父进程收到这个信号后可以对子进程进行回收。
使用SIGCHLD信号完成对子进程的回收可以避免父进程阻塞等待而不能执行其他操作,只有当父进程收到SIGCHLD信号之后才去调用信号捕捉函数完成对子进程的回收,未收到SIGCHLD信号之前可以处理其他操作。
使用SIGCHLD信号完成对子进程的回收
练习:父进程创建三个子进程,然后让父进程捕获SIGCHLD信号完成对子进程的回收。
- 注意点:
- 有可能还未完成信号处理函数的注册三个子进程都退出了。
- 解决办法:可以在fork之前先将SIGCHLD信号阻塞,当完成信号处理函数的注册后在解除阻塞。
- 当SIGCHLD信号函数处理期间,SIGCHLD信号若再次产生是被阻塞的,而且若产生了多次,则该信号只会被处理一次,这样可能会产生僵尸进程。
- 解决办法: 可以在信号处理函数里面使用while(1)循环回收,这样就有可能出现捕获一次SIGCHLD信号但是回收了多个子进程的情况,从而可以避免产生僵尸进程。