我正在做一些并行编程(多处理),我需要父母:
1)Fork
几个孩子
2)在创建了所有孩子之后,只需等待所有孩子终止
3)在所有孩子被终止后,做一些其他的工作。
这就是我的尝试:
int main(int argc, char **argv[])
{
int j, i;
pid_t children[3];
int pid;
// Fork the processes
for(j = 0; j < 3; j++){
if((children[j] = fork()) == 0){
// Child process
for(i = 0; i < 2; i++){
printf("child %d printing: %d\n", j, i);
}
}else {
// In parent now
while (pid = waitpid(-1, NULL, 0)) {
if (errno == ECHILD) {
break;
}
}
printf("all children terminated. in parent now\n");
}
}
return 0;
}
没有给出正确的输出。 &#34;所有孩子都被终止了。现在在父母身上&#34;即使在所有孩子都死了之前,也要多次打印出来。此外,对于每个进程,我应该只看到2个输出,但我看到更多。任何帮助都会被贬低。
答案 0 :(得分:1)
每个孩子都在执行循环和分叉。打印输出后,您需要打破j
循环。由于这些孙子孙女不是原始父母的孩子,并且第一代孩子从不等待他们,所以输出的顺序是未指定的。此外,您需要将waitpid
从j循环中取出,直到所有子项都被分叉后才执行它。
答案 1 :(得分:1)
这是你想要实现的更多吗?我只是为每个孩子设置一个简单的计数,延迟时间来增加并行化可见性。
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char **argv[])
{
int i, j, k;
int pid;
// Fork the processes
for(j = 0; j < 3; j++)
{
if (fork() == 0)
{
printf("starting child %d\n", j);
// Child process - do your child stuff
for (i = 0; i < 5; ++i)
{
for (k = 0; k < 10000000; ++k);
printf("child %d printing: %d\n", j, i);
}
printf("child %d ending\n", j);
// then just quit
exit(0);
}
}
j = 1;
while (wait(NULL) > 0)
{
printf("%d child completed\n", j++);
}
// In parent now
printf("all children terminated. in parent now\n");
return 0;
}
我得到的输出是
starting child 0
starting child 1
child 0 printing: 0
starting child 2
child 1 printing: 0
child 0 printing: 1
child 2 printing: 0
child 1 printing: 1
child 0 printing: 2
child 0 printing: 3
child 2 printing: 1
child 1 printing: 2
child 1 printing: 3
child 0 printing: 4
child 0 ending
child 2 printing: 2
1 child completed
child 1 printing: 4
child 1 ending
2 child completed
child 2 printing: 3
child 2 printing: 4
child 2 ending
3 child completed
all children terminated. in parent now
肯