2015-04-17 83 views
1

我有這樣的代碼:檢查兩個進程的退出碼

pid_t pid1 = fork(); 

    if (pid1 == 0) 
    { 
    //do some stuff 
    if (something) 
     exit(0); 
    else 
     exit(1); 
    } 
    else if (pid1 == -1) 
    printf("error\n"); 

    pid_t pid2 = fork(); 

    if (pid2 == 0) 
    { 
    //do some stuff 
    if (something) 
     exit(0); 
    else 
     exit(1); 
    } 
    else if (pid2 == -1) 
    printf("error\n"); 

//here I want to check both exit codes 

子進程將並行運行。我需要的是檢查退出代碼是否是10。我以爲我可以使用這樣的:

pid_t pid; 
int status; 
while((pid = wait(&status)) > 0) 
    printf("%d exit code: %d\n", pid, WEXITSTATUS(status)); 

我新的並行程序,所以我不知道這是一個正確的解決方案。在父進程到達循環之前,其中一個子進程沒有退出的可能性,因此它不會得到退出代碼?

+1

你的代碼有什麼問題?當你運行它會發生什麼? –

回答

2

如果一個或兩個孩子的處理退出父首先調用wait()之前,則該操作系統將直到父達到wait()按住退出代碼和/或理由終止。這正是「殭屍進程」的意義所在。

+0

謝謝你,那是我正在尋找的答案。 – sykatch

0

在這裏看到:http://linux.die.net/man/2/wait

wait()將阻塞,直到兩個過程的一個結束,有關該過程的返回信息。您可以撥打wait(),直到沒有更多的孩子,或者使用waitpid獲取有關特定PID的信息。

因此,要回答你的問題 - 你的代碼看起來不錯。 wait()負責照顧您的競爭條件,因爲它會阻止執行,直到其中一個孩子退出(或以其他方式停止)。

2

如果一個進程在父進程到達wait()之前退出,它將變爲defunct進程(或zombie進程)。這是可以的,因爲如果稍後調用wait函數,它將得到該退出代碼並且殭屍進程將成功終止。

而不是使用wait()這將只是等待任何過程中,你可以使用waitpid()等待一個特定的進程,通過其特定PID確定,因爲你必須等待兩個過程。

pid_t waitpid(pid_t pid, int *status, int options);

的等待()系統調用掛起調用進程的執行,直到 一個其子女的終止。呼叫等待(&狀態)相當於 到:

waitpid(-1, &status, 0);

的waitpid函數()系統調用掛起調用過程 的執行,直到由PID參數指定的子狀態發生了改變。默認情況下, waitpid函數()等待只爲終止的孩子,但這種行爲是 通過選項參數修改,如下所述。 PID值可以是:

< -1

任意子進程,其進程組ID等於 的PID絕對值意思的等待。

-1

意味着等待任何子進程。

0

意味着等待任何子進程,其進程組ID等於 調用進程的。

> 0

意味着等待其進程ID等於 PID值的孩子。