【发布时间】:2018-10-02 16:50:19
【问题描述】:
我有以下使用 fork() 函数创建子进程的程序
#include <stdio.h>
int main (){
printf("PID:%d\n",getpid());//print1:P1
fork();
fork();
fork();
printf ("Done"); //print2:P2
}
我试图了解上述程序如何打印 'Done' 8 次,因为输出。
【问题讨论】:
-
你有一个父进程。首先
fork()创建一个子进程。第二个fork()由父进程和子进程都执行,因此您创建了两个额外的进程,依此类推。 -
"...上面的程序打印 'Done' 8 次..." - 错误!上面的程序打印“完成”ONCE。孩子们每人打印一次“完成”... TO THE SAME CONSOLE(“StdOut”)。您的子进程也会创建子进程:第一个孩子:两个孩子,第二个孩子,一个。他们的孩子创造孩子。因此,总共是“8”。
-
@paulsm4 Jee,不要用大写和斜体字了。
-
另外一点 - 孩子fork() 影响父母的ONLY 方式是将孩子的PID 返回给父母。无论如何你都没有使用它:(
-
您可以使用
int pid1 = fork(); int pid2 = fork(); int pid3 = fork();捕获来自fork()的返回值,然后打印所有信息:printf("Done: PID = %d, PPID = %d, pid1 = %d, pid2 = %d, pid3 = %d\n", (int)getpid(), (int)getppid(), pid1, pid2, pid3);,从而更好地跟踪正在发生的事情。正确解释,这将使发生的事情更加清晰——您将知道哪个进程打印了每一行输出。 (唯一的问题可能是不同进程之间的隔行打印;如果它成为一个常规问题,那就更难解决了。)