В книге «Расширенное программирование в Unix среде», раздел wait и waitpid говорит:
функция waitpid не ожидает дочернего элемента, который завершается первым; у него есть несколько опций, которые определяют, какой процесс он ожидает.
Я читал это так, как если бы дочерний процесс завершился первым, а родительский процесс не вызвал функцию waitpid
, дочерний процесс процесс не будет ждать и останется как процесс zomb ie после выхода.
Итак, я написал код для проверки:
int main() {
pid_t pid = fork();
if (pid == 0) {
// child process
printf("Child Process ID: %d \n", getpid());
printf("Child Process Quit\n");
exit(0);
} else {
// parent
sleep(5);
printf("Parent Process ID: %d \n", getpid());
printf("Wait child %d ...\n", pid);
int status;
waitpid(pid, &status, 0);
printf("waitpid called\n");
sleep(5);
}
return 0;
}
Программа сначала распечатала «Дочерний процесс». ID "и" дочерний процесс завершен ", пока родительский процесс все еще спит, в другом окне терминала, если я использую ps -el | grep 'Z'
, я вижу, что этот дочерний процесс <defunct>
(zomb ie).
Затем через 5 секунд, пока родительский процесс с именем waitpid
в другом терминальном окне, использование ps -el | grep 'Z'
больше не будет показывать дочерний процесс zomb ie, то есть дочерний процесс ожидание процесса, а не зомба ie.
Так что кажется, что родительский процесс всегда может ожидать дочерний процесс с waitpid
, поэтому как интерпретировать эту функцию "waitpid не ждет для ребенка, который заканчивается первым "?