如何在不轮询和不占用其他人子进程的退出代码的情况下等待一组子进程(并且只等待它们)?
for each 子元素的每个FD0创建一个管道,并使用select()来等待这些FD,这是一个好主意吗?
是否必须使用SELECT()的Exceltfds参数?
如何在不轮询和不占用其他人子进程的退出代码的情况下等待一组子进程(并且只等待它们)?
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>
中的换行符