我正在用C編寫一個多進程程序。父母如何等待所有子進程完成,然後在收到SIGINT時退出?
我希望父母進程可以等待所有的子進程完成,然後在 它收到SIGINT時退出。
我有兩個問題。
家長如何記錄孩子的每個PID過程它分叉。 子進程可能會在 主進程運行記錄功能之前完成。
如果父母不知道它有多少個子進程。他如何等待 所有子進程結束。
在此先感謝。
我正在用C編寫一個多進程程序。父母如何等待所有子進程完成,然後在收到SIGINT時退出?
我希望父母進程可以等待所有的子進程完成,然後在 它收到SIGINT時退出。
我有兩個問題。
家長如何記錄孩子的每個PID過程它分叉。 子進程可能會在 主進程運行記錄功能之前完成。
如果父母不知道它有多少個子進程。他如何等待 所有子進程結束。
在此先感謝。
您在分叉時記錄子進程的pid(如果需要)。 在pid = 0的循環中調用waitpid
它將返回退出或返回-1的進程的PID,並且如果errno = ECHILD
您沒有剩餘奴隸。
繼續在循環中調用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,你應該特別檢查errno for ECHILD,特別是在擺脫循環之前。 –