想象一下,我有一个启动几个子进程的进程。父母需要知道孩子何时离开。
我可以使用waitpid,但是如果/当父母需要退出时,我无法告诉被阻塞的线程waitpid正常退出并加入它。自己清理一下是很高兴的,但可能没什么大不了的。
waitpid
我可以waitpid与结合使用WNOHANG,然后在任意时间睡眠以防止繁忙的等待。但是,那时我只能知道孩子是否经常离开。就我而言,知道孩子何时立即离开可能并不重要,但我想尽快知道…
WNOHANG
我可以为使用信号处理程序SIGCHLD,并在信号处理程序中执行孩子退出时要执行的任何操作,或者将消息发送到其他线程以执行某些操作。但是,使用信号处理程序会使代码流有些混乱。
SIGCHLD
我真正想做的是使用waitpid某个超时时间,例如5秒。由于退出进程不是时间紧迫的操作,因此我可以延迟发出信号退出线程,同时在waitpid其余时间仍将其阻塞,随时准备进行响应。 Linux中有这样的电话吗? 在其他选择中,哪一个是最好的?
编辑:
基于答复的另一种方法是SIGCHLD使用pthread\ 阻塞所有线程_sigmask()。然后在一个线程中,继续sigtimedwait()寻找SIGCHLD。这意味着我可以在该调用上超时,并检查线程是否应该退出,如果不是,则退出线程等待信号。将a SIGCHLD传递到此线程后,我们可以立即在等待线程中对其做出反应,而无需使用信号处理程序。
pthread
_sigmask()
sigtimedwait()
该函数可能会被信号中断,因此您可以在调用waitpid()之前设置一个计时器,并且在引发计时器信号时它将以EINTR退出。编辑:应该像在调用waitpid()之前调用alarm(5)一样简单。