如何等待一组子进程(并且仅等待它们)而不轮询并且不消耗其他子进程的退出代码?
为每个 child 的每个 fd 0 创建一个管道并使用 select() 等待这些 fd,这是一个想法吗?
是否必须使用 select() 的 exceptfds 参数?
最佳答案
如果您可以使它们全部属于同一进程组,则可以使用 waitpid
的否定进程组 ID .
例如
pid_t first = fork()
if(first == 0) {
// ... thread function
exit(0);
}
setpgid(first, 0); // creates a new process group
for(int i=0; i<10; i++)
{
pid_t pid = fork();
if(pid == 0)
{
// ... thread function
exit(0);
}
setpgid(pid, first); // joins the process group
}
int status;
waitpid(-first, &status, WUNTRACED);
这将等待以这种方式创建的进程,但不会等待其他子进程,并且不会耗尽其他退出代码。
如果您打算调用 exec()
中的任何一个在子进程中运行时,您应该确保在此之前设置进程组id。您可以通过在主进程和子进程中设置它来完成此操作。因此,对于第一个,您将使用
pid_t first = fork()
if(first == 0) {
setpgid(0, 0);
execv(filename, args);
}
setpgid(first, 0);
和setpgid(0, first)
对于其他人。
您需要包含<unistd.h>
和<sys/wait.h>
关于c++ - 如何等待一组子进程(并且仅等待它们)而不轮询并且不消耗其他子进程的退出代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75550920/