簡體   English   中英

unix fork()系統調用什么時候運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM