linux 如何等待一组子进程(并且只有它们),而不进行轮询,也不吃掉其他人的子进程的退出代码?

ylamdve6  于 2023-03-01  发布在  Linux
关注(0)|答案(1)|浏览(74)

如何等待一组子进程(并且只有它们),而不进行轮询,也不吃掉其他人的子进程的退出代码?
为每个child的每个fd 0创建一个管道,然后使用select()等待这些fd,这是一个好主意吗?
是否必须使用select()的exceptfds参数?

xytpbqjk

xytpbqjk1#

如果可以使它们都成为同一个进程组的一部分,那么可以对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>

相关问题