2016-04-21 59 views
-4

我有這個代碼,執行根據的,如果活動過程是父或在一個無限循環的子過程中的一些代碼:爲什麼這個代碼使用fork()的工作?

pid_t childPID; 

childPID=fork(); 

while (1) 
{ 
    if (childPID >=0) 
    { 
     if (childPID==0) 
     { 
      [do child process stuff] 
     } 
     else 
     { 
      [do parent process stuff] 
     } 
    } 
    else 
    { 
     printf("\n Fork failed, quitting!!!!!\n"); 
     return 1; 
    } 
} 

代碼很簡單,但有它一個非常大的事情對我來說這我不明白它是如何發生的,雖然我有一個猜測:

如果沒有考慮到我們正在創建2個進程,它看起來像childPid不斷被重新分配,我認爲沒有任何意義。

所以我的猜測是,fork爲每個進程創建一個childPid,返回一個0到父進程和pid到子進程,即使這個語法讓我認爲它應該只返回一個結果並賦值chilPid。

是我的猜想正確,或有參與一些其他的事情嗎?

謝謝。

+0

如何執行'[do parent stuff] '和'[做孩子的東西]'結束?他們中的任何一個是否退出該計劃? – fuz

+2

'man fork',return value:「成功時,子進程的PID返回父進程,0返回給子進程,失敗時返回-1,父進程未創建,並且errno被適當地設置。「 – keltar

+2

」不斷被重新分配「 - 我在這個代碼中只看到一個賦值給'childPid',它的*不*在一個while循環中 – WhozCraig

回答

1

fork(2) linux man page

成功時,子進程的PID返回父,並在孩子則返回0。如果失敗,則返回-1父,沒有子進程創建的,errno設置爲合適

所以childPID是在子進程0,是孩子的父進程PID

2

所以我的猜測是,叉爲每個進程創建一個childPid,返回一個0到父進程和PID子進程,即使這句法讓我覺得這應該只返回結果只有一個,並將其分配給chilPid。

這一點。從叉參考手冊:

返回值: 成功時,子進程的PID被返回在父,並且 0在子被返回。如果失敗,則返回-1父,創建 沒有子進程,並errno設置爲合適。

所以

是我的猜想

爲什麼如果這正是POSIX規範定義的猜測?

+0

我已經讀過,但是當我看到代碼時,我認爲它的返回並不意味着它指定給第一個過程中定義的變量,從我的觀點來看,描述也可以創建2個可以訪問的新變量使用類似[parent_process] .childPID或[chil_process] .childPid的語法,因此您可以在需要時引用每個語句,而不是在事先不知道它是否引用父進程或子進程的情況下訪問childPid。 – user2638180

+0

@ user2638180:經過一個成功的fork後,有一個原始進程正在運行的完美副本,並且父進程和子進程都處於相同的狀態。但他們的記憶圖像是不同的。如果返回一個PID對,那麼兩個進程都不可能判斷它是父母還是孩子。因此,需要一個輕微但顯着的不對稱。這是通過向父母和孩子返回不同的值來實現的。一個進程可以用'getpid()'查詢它的PID,所以孩子看到一個'fork()'返回並且父子PID。這引入了所需的不對稱性。 – datenwolf

1

fork做什麼是創建實際的過程中的一個新副本是子進程。

childPID=fork();在兩個進程中被賦值,它只返回一個值,訣竅是該值根據執行哪個進程而不同。在父進程返回新進程的PID(子進程),如果子進程返回0,如果fork未成功返回-1並且從未創建子進程

相關問題