说在前面
- 环境: WSL、ubuntu16
- 参考: UNIX网络编程、linux manual page
- 目录:这里
- 本体:⟅UNIX网络编程⟆⦔wait和waitpid函数
问题提出
- 见问题
- 已知while(waitpid)是回收所有已终止进程的,但是它是如何解决“信号处理函数不可重入”的问题?
- 疑问来源:
在信号处理函数sig_child中如果使用wait,是不可以保证回收所有已终止的子进程。
在书上说是因为,“所有信号都在信号处理函数执行之前产生,而信号处理函数只执行一次”(因为在sig_child函数调用期间,SIGCHLD信号是阻塞的)
使用waitpid可以解决上述问题,因为WNOHANG可以让waitpid立即返回。
但是WNOHANG应该没有解决“所有信号都在信号处理函数执行之前产生,而信号处理函数只执行一次”(即信号处理函数不可重入)这个问题。
问题解决
- 首先,wait和waitpid,都不是用SIGCHLD触发的,只是很多人喜欢在信号处理函数里用wait/waitpid;
- 其次,在信号处理函数中用wait.waitpid是有风险的,信号处理函数时不能重入的,即如果信号函数没执行完,再来一个信号,有可能导致进程死锁;
- 推荐的用法,信号处理函数中置标记位,退出信号处理函数后根据标记位调用wait/waitpid
(感谢老师的回答)
来源:CSDN
作者:o0o_-_
链接:https://blog.csdn.net/qq_33446100/article/details/103850357