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

说在前面

问题提出

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

问题解决

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

感谢老师的回答


发布了106 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_33446100/article/details/103850357
今日推荐