2011-06-17 44 views
0

fork()用於創建子進程...並且您看到此調用也出現在子進程中。當他們說'調用fork實際返回兩次'時,我不明白它意味着什麼。fork()調用,複製進程

而且這是什麼意思?

if (fork() == 0) 
/* the child process's thread executes here*/ 

else 
/*the parent process's thread executes here*/ 

是父母或子女的上面的代碼部分。你能用簡單的英語來解釋發生了什麼事嗎?

另外,爲什麼要使用fork()?它說這個系統調用運行在unix中的所有進程?你如何fork()所以其他程序可以運行?你是否指定了程序的名稱?

回答

1

他們說它返回兩次的意思是,調用在父進程(它調用它)返回一次,並且一次在子進程中(它沒有,儘管你可能會爭辯說子繼承從父母那裏調用fork的行爲就像它繼承了其他許多事情一樣)。

代碼片段利用了從fork獲取不同返回值的事實,具體取決於您是父進程還是子進程。

子進程獲取零並且父進程獲取子進程的非零進程標識。

如果fork由於某種原因失敗,您也可以返回-1,在這種情況下,孩子將不會運行。這也是你應該檢查的東西。

而且,儘管fork用於創建新過程,它的exec家族新程序加載到這些進程的呼叫:fork對自己不能做到這一點。

該過程的一個很好的概述可以找到here

1

這有點像這樣:

Process 1    Process 2 

int main() { 
    ... 
    int x = goo(); 
    ... 
    int y = fork(); 
    // fork() returns... // ... but also here! 

    // here y = 123   // here y = 0 
    if (y) {    if (y) { 
    // this happens   // false 
    } else {    } else { 
    // false    // this happens 
    }      } 

    int z = baz();   int z = baz(); 
    ...      ... 
    return 0;    return 0; 
}      } 

當過程2來生活,程序存在兩次,和第二過程用叉的返回開始()。由於程序在兩個進程中都是相同的,因此區分進程的唯一方法是fork()的返回值。