⟅UNIX网络编程⟆⦔wait和waitpid函数-补充

扶醉桌前 提交于 2020-01-25 17:37:51

说在前面

问题提出

  • 问题
  • 已知while(waitpid)是回收所有已终止进程的,但是它是如何解决“信号处理函数不可重入”的问题?
  • 疑问来源:
    在信号处理函数sig_child中如果使用wait,是不可以保证回收所有已终止的子进程。
    在书上说是因为,“所有信号都在信号处理函数执行之前产生,而信号处理函数只执行一次”(因为在sig_child函数调用期间,SIGCHLD信号是阻塞的)
    使用waitpid可以解决上述问题,因为WNOHANG可以让waitpid立即返回。
    但是WNOHANG应该没有解决“所有信号都在信号处理函数执行之前产生,而信号处理函数只执行一次”(即信号处理函数不可重入)这个问题。

问题解决

  • 首先,wait和waitpid,都不是用SIGCHLD触发的,只是很多人喜欢在信号处理函数里用wait/waitpid
  • 其次,在信号处理函数中用wait.waitpid是有风险的,信号处理函数时不能重入的,即如果信号函数没执行完,再来一个信号,有可能导致进程死锁
  • 推荐的用法,信号处理函数中置标记位,退出信号处理函数后根据标记位调用wait/waitpid

感谢老师的回答


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!