Unix fork()系统调用什么时候运行?

void child(int pid){ printf("Child PID:%d\n",pid); exit(0); } void parent(int pid){ printf("Parent PID:%d\n",pid); exit(0); } void init(){ printf("Init\n");//runs before the fork } int main(){ init();//only runs for parent ie runs once printf("pre fork()");// but this runs for both ie runs twice //why??? int pid = fork(); if(pid == 0){ child(pid); //run child process }else{ parent(pid);//run parent process } return 0; } 

输出:

 Init pre fork()Parrent PID:4788 pre fork()Child PID:0 

我在Unix操作系统上有一个进程(在我的情况下是Ubuntu)。 我不能为了我的生活理解这是如何工作的。 我知道fork()函数分裂我的程序在两个进程,但从哪里? 它创build一个新的进程,并再次运行整个主函数,如果是这样,为什么init()只运行一次,而printf()两次?

为什么printf("pre fork()"); 运行两次和init()函数只有一次?

只有一个过程,直到叉。 也就是说,该路径只执行一次。 fork之后有2个进程,所以这个系统调用之后的代码被两个进程执行。 你忽略的是两个终止,都将调用exit

在你的代码中,你不会冲洗stdio 。 所以两个进程都这样做(退出刷新stdio缓冲区) – 这就是为什么你看到了输出。

尝试这个:

 printf("pre fork()\n"); ^^ should flush stdout 

或者可能

 printf("pre fork()\n"); fflush(stdout);