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);