2012-11-21 132 views
1

這是什麼意思if(!fork())?我有點困惑,我不知道,當林在父母子女的過程:if(!fork) - 這是什麼意思?

if(!fork()) 
{ 
    // is it child or parent process? 
}else{ 
    // is it child or parent process? 
} 

回答

8

fork(2) manpage

返回值

成功時,子進程的PID返回父, 和0的孩子返回。如果失敗,則在 父項中返回-1,不會創建子進程,並且適當地設置errno。

由於fork()返回0到孩子,如果從句的測試,如果它是一個孩子:

if (!fork()) // same as: if (fork() == 0) 
{ 
    // child 
}else{ 
    // parent 
} 
+0

多數民衆贊成它,謝謝!現在我完全理解它!謝謝:) – mazix

+2

唯一的問題是,它不會區分父錯誤。 – pmg

+0

@pmg:既然它沒有記錄孩子的pid,大概父母並不關心它發生了什麼。所以也許它不在乎是否有錯誤。 –

0

man fork,你會知道更多。 它實際上對於父進程的子進程,並正值返回pid_t實際上int

是在成功返回它給,0

其實是這樣的:

pid_t pid; 
pid=fork(); 

if(pid <0) 
{ 
printf("fork failed"); 
return -1; 
} 
else if(pid == 0) 
{ 
    it is child process 
} 
else 
{ 
    It is parent process 
} 

,所以當你做if(!fork())這意味着definitly child process,因爲!0 == 1即如果條件爲真,它將執行if(!fork())

2

因爲0可以在有條件的可以使用,好像它是一個布爾值,這是一樣的問:

if(fork() == 0) { 

文檔說:

如果成功,孩子的PID進程返回父進程中, 並且0在子進程中返回。如果失敗,則在 父項中返回-1,不會創建子進程,並且適當地設置errno。

這是一個常見的成語直接在條件使用整數值時譯碼器只關心「不0」或0(「真」或「假」)。

+1

現在我明白了:D簡單而簡短的回答,謝謝! – mazix

1

fork的調用在孩子中返回0(當然,如果它有效),因此if語句的真實(第一個)部分在那裏運行(因爲!0爲true)。

錯誤(第二個)部分在父項中執行,是否fork成功(返回子項的PID)或失敗(返回-1)。

我並不是這種特殊方法的粉絲,因爲它沒有考慮到所有的邊緣情況。我喜歡這樣的:

pid_t pid = fork(); 
switch (pid) { 
    case -1: { 
     // I am the parent, there is no child, see errno for detail. 
     break; 
    } 
    case 0: { 
     // I am the child. 
     break; 
    } 
    default: { 
     // I am the parent, child PID is in pid, eg, for waitpid(). 
     break; 
    } 
} 

使用這個配置,你知道究竟這是怎麼回事,沒有信息丟失。

0

fork()值可以是:

  • 0,這意味着它是一個小孩

  • < 0,這是一個錯誤

  • > 0母體,這意味着它是一個父

由於if (!fork())是寫if (fork() == 0)的僅有很短的方式,它的意思是:

if(!fork()) { 
    // it is a child process 
} 
else { 
    // it is a parent process 
} 
1

if(!fork()) 
{ 
    /* its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */ 
}else{ 
    /* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */ 
} 

1

該代碼沒有按不檢查叉子的錯誤!當已經有很多進程正在運行時,或者沒有足夠的內存時,分支將失敗,並且您的軟件可能會以非常奇怪的方式運行。