c++ - 如何等待一组子进程(并且仅等待它们)而不轮询并且不消耗其他子进程的退出代码?

标签 c++ linux pipe child-process

如何等待一组子进程(并且仅等待它们)而不轮询并且不消耗其他子进程的退出代码?

为每个 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/

相关文章:

c - DMA 传输到 Linux 中的从属 PCI 设备

linux - 如何查找路径包含特定目录的所有文件

python - 子进程通信 : order matters?

python - 子进程管道标准输入而不使用文件

c++ - 在什么情况下我可以在 C++ 中使用 == 直接比较两个 float 变量?

c++ - 如何将 std::vector 用于带句柄的类

c++ - 将 public 关键字与结构一起使用

linux - 安装 g++ 而不更新 glibc

sockets - 套接字与管道的性能

c++ - MFC 应用程序的 map 插件