如何在不轮询和不占用其他人子进程的退出代码的情况下等待一组子进程(并且只等待它们)?

for each 子元素的每个FD0创建一个管道,并使用select()来等待这些FD,这是一个好主意吗?

是否必须使用SELECT()的Exceltfds参数?

推荐答案

如果您可以使它们都属于同一进程组,则可以使用取反的进程组ID来表示waitpid.

例如

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>

Linux相关问答推荐

是否可以在Bash正则表达式中排除?

没有发现运行时依赖关系,但它在S的运行时路径中有吗?

用户作用域在Linux内核密钥环(Golang)中是什么意思?

仅查找并保留有效邮箱并删除无效记录,AWK

如何将一个变量的 2 行添加到另一个变量的特定行?

sed:用空格替换

中的换行符

为什么 8 位字符串文字可以包含多字节字符,而 char 向量不能?

使用 bash 中的数字对 RPM 内核字符串进行版本排序返回不正确的结果

Linux合并文件

如何在 Linux 命令行上解析 CSV 文件?

如何在 Ubuntu 上安装 chkconfig?

从 Linux shell 将多个文件从一个目录复制到另一个目录

在亚马逊 ec2 linux 微型实例上的 virtualenv 中安装 scipy 时遇到问题

比较linux中两个未排序的列表,列出第二个文件中的唯一性

linux根据文件名模式搜索文件

Linux 上真的没有异步块 I/O 吗?

如何通过命令提示符判断 Linux 中的 BIOS 版本或名称?

Linux:用户名不在 sudoers 文件中

什么是 linux 脚本中的 start-stop-daemon?

计算每个进程打开的文件