【发布时间】:2017-11-27 01:40:58
【问题描述】:
我正在使用fork() 练习并行编程。我希望每个进程的父 id 都是前进程的 id,但在我的输出中显示相同的 id。为什么?第二个问题是关于终止的。有时输出显示所有进程,有时只有两个或三个,有时只有一个。为什么?我知道父进程应该等待它的子进程,但如果不是我的问题。我的困惑是当fork() 被调用时,两个进程都是在不知道它们的顺序的情况下执行的,不是吗?也许父进程终止了它自己的执行。 但它的孩子可以继续运行到程序的其余部分或终止或其他什么? (从输出中可以看出并不总是终止,也不总是完全正确)我不理解输出只显示一个但有时是两个或三个或不是全部。 我希望我能解释我的问题。貌似我做不到。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
pid_t childpid = 0;
int i;
for (i = 0; i < 3; i++)
if (childpid = fork())
break;
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
输出:
i:0 process ID:2783 parent ID:1954 child ID:2784
i:1 process ID:2784 parent ID:1 child ID:2785
i:2 process ID:2785 parent ID:1 child ID:2786
i:3 process ID:2786 parent ID:1 child ID:0
or
//how??
i:0 process ID:3016 parent ID:1954 child ID:3017
i:1 process ID:3017 parent ID:1 child ID:3018
i:2 process ID:3018 parent ID:1 child ID:3019
or
//how??
i:0 process ID:4079 parent ID:1954 child ID:4080
i:1 process ID:4080 parent ID:1 child ID:4081
or
//how??
i:0 process ID:3038 parent ID:1954 child ID:3039
预期输出:
i:0 process ID:2783 parent ID:1954 child ID:2784
i:1 process ID:2784 parent ID:2783 child ID:2785
i:2 process ID:2785 parent ID:2784 child ID:2786
i:3 process ID:2786 parent ID:2785 child ID:0
【问题讨论】:
-
“我知道父进程应该等待它的子进程。”它不会自动您必须致电
wait()或waitpid() -
你不要等你的孩子有什么要补充的。
-
我知道,如果您阅读我的问题,您可以详细回答我希望。 @Stargateur
-
顺便说一句,我总是用你的minimal reproducible example 输出 4 行。而且我不明白这怎么可能少...你能证明你得到这种输出吗?
标签: c parallel-processing fork posix