2011-09-25 63 views
0

我正在用C編寫一個多進程程序。父母如何等待所有子進程完成,然後在收到SIGINT時退出?

我希望父母進程可以等待所有的子進程完成,然後在 它收到SIGINT時退出。

我有兩個問題。

  1. 家長如何記錄孩子的每個PID過程它分叉。 子進程可能會在 主進程運行記錄功能之前完成。

  2. 如果父母不知道它有多少個子進程。他如何等待 所有子進程結束。

在此先感謝。

回答

1

您在分叉時記錄子進程的pid(如果需要)。 在pid = 0的循環中調用waitpid它將返回退出或返回-1的進程的PID,並且如果errno = ECHILD您沒有剩餘奴隸。

0

繼續在循環中調用wait(2)。每次wait()返回時,都會返回已退出子節點的PID及其狀態。狀態會告訴你,它是否正常退出(帶有退出代碼)或由於信號。像這樣的東西(未測試):

#include <sys/types.h> 
#include <sys/wait.h> 
... 
pid_t pid; 
int  status; 
... 
while ((pid = wait(&status)) > 0) { 
     printf("Child %lu ", (unsigned long)pid); 
     if (WIFEXITED(status)) 
       printf("exited with status %d\n", WEXITSTATUS(status)); 
     else if (WIFSIGNALED(status)) 
       printf("killed by signal %d\n", WTERMSIG(status)); 
     else if (WIFSTOPPED(status)) 
       printf("stopped by signal %d\n", WSTOPSIG(status)); 
     else if (WIFCONTINUED(status)) 
       printf("resumed\n"); 
     else 
       warnx("wait(2) returned for no discernible reason"); 
} 
+1

如果等待返回-1,你應該特別檢查errno for ECHILD,特別是在擺脫循環之前。 –

相關問題