⟅UNIX网络编程⟆⦔wait和waitpid函数-补充
目录 说在前面 问题提出 问题解决 说在前面 环境: 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