[英]Unix fork() system call what runs when?
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 i.e. runs once
printf("pre fork()");// but this runs for both i.e. 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()
函數在兩個進程中分割我的程序但是從哪里來? 它是否創建了一個新進程並再次運行整個main函數,如果是這樣,為什么init()
只運行一次而printf()
兩次?
為什么是printf("pre fork()");
運行兩次, init()
函數只運行一次?
在fork之前只有一個進程。 也就是說,該路徑只執行一次。 fork之后有2個進程,因此系統調用之后的代碼由兩個進程執行。 你忽略的是兩個都終止,兩者都會調用exit
。
在您的代碼中,您不會刷新stdio
。 所以這兩個進程都這樣做(退出刷新stdio緩沖區) - 這就是你看到輸出的原因。
試試這個:
printf("pre fork()\n");
^^ should flush stdout
或者可能
printf("pre fork()\n");
fflush(stdout);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.