假设我有一个启动多个子进程的进程.家长需要知道子元素何时退出.

我可以使用waitpid,但如果/当父线程需要退出时,我无法告诉在waitpid中被阻止的线程优雅地退出并加入它.让事情自行清理是件好事,但这可能没什么大不了的.

我可以使用waitpidWNOHANG,然后任意Hibernate 一段时间,以避免忙碌的等待.然而,我只能知道一个子元素是否偶尔离开过.在我的情况下,我知道子元素什么时候出来可能不是特别关键,但我想尽快知道……

我可以使用一个SIGCHLD的信号处理程序,在信号处理程序中,当一个子线程退出时,我可以做任何我想做的事情,或者向另一个线程发送一条消息来执行一些操作.但是,使用信号处理程序会稍微混淆代码流.

我真正想做的是在某个超时时间使用waitpid,比如说5秒.因为退出进程不是一个时间关键的操作,所以我可以懒洋洋地向线程发出退出信号,同时在剩余的时间里它仍然被阻塞,随时准备做出react .Is there such a call in linux? Of the alternatives, which one is best?


编辑:

另一种基于回复的方法是在所有线程中用pthread\_sigmask()阻塞SIGCHLD.然后在一个线程中,继续拨打sigtimedwait(),同时寻找SIGCHLD.这意味着我可以在调用时超时,并判 break line 程是否应该退出,如果不应该退出,则保持阻塞状态,等待信号.一旦一个SIGCHLD被传递到这个线程,我们就可以立即对它做出react ,并且按照等待线程的顺序进行,而无需使用信号处理程序.

推荐答案

该函数可以被一个信号中断,因此您可以在调用waitpid()之前设置一个计时器,当计时器信号发出时,它将以EINTR退出.编辑:在调用waitpid()之前,它应该像调用alarm(5)一样简单.

C++相关问答推荐

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

C sscanf没有捕获第二个参数

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

是否有任何情况(特定类型/值),类型双关在所有符合标准的C实现中产生相同的行为?

不会停在空格或换行符上的错误

非常大的数组的大小

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

进程已完成,退出代码为138 Clion

如何计算打印二叉搜索树时每行所需的空间?

如何编写一个for循环来计算C中各项的总和?

在C中访问数组中的特定值

如何在c中使用具有不同变量类型的内存分配?

我应该在递归中使用全局变量吗

GetText不适用于包含国际字符的帐户名称

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

将char*铸造为空**

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

如何用用户输入的多个字符串填充数组?

使用复合文字数组初始化的指针数组