簡體   English   中英

fork在該程序上如何工作?

[英]How does fork work on this program?

我有這個程序

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x =1;
    int* y = malloc(sizeof(int));
    *y = 2;

    if (fork()==0)
        x++;

    if (fork()==0)
        (*y)++;

    printf("%d", (x+*y));
}

這是輸出3445。到目前為止,這是我所知道的,fork()創建了一個新的子進程。 如果是子進程,則fork()返回0;如果是父進程,則返回PID。 因此,一旦調用fork(),它將成為父級,而fork()== 0則僅在子進程而非父進程上為true。 誰能讓我對實際發生的事情有更多的了解,以便獲得輸出結果?

畫一個圖來顯示孩子與父母之間的關系,它們的統計數據對您有所幫助,這是一種可能的形式(C代表孩子,P代表父母):

fork()
  C (x == 2, *y == 2)
  fork()
    C (x == 2, *y == 3) ==> print 5
    P (x == 2, *y == 2) ==> print 4
  P (x == 1, *y == 2)
  fork()
    C (x == 1, *y == 3) ==> print 4
    P (x == 1, *y == 2) ==> print 3

因此,將打印5、3、4、4的某種組合,確切的組合取決於這些printf()調用的順序, 一次運行可能會有所不同

fork()會在錯誤時返回-1,因此您也必須進行檢查。 因此,最好執行以下操作:

int pid;

pid = fork();

if (pid == 0)
{
    //child process code goes here
}
if (pid > 0)
{
    //parent process code goes here
}

請注意,您在第一個fork()之后擁有兩個進程,然后又執行一次fork(),因此最終得到4個進程。

而且,當然,它們的執行順序是不確定的,因此每次運行此命令時,您將分別獲得3、5和4的不同組合。

另外,請注意,如果不在fork()之前調用flush(...),則某些printf(...)和fork()組合可能導致奇怪的輸出。

最后,您忘了最后釋放(y),因此每次運行此程序時,您泄漏4 * sizeof(int)個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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