Если I fork
дочерний процесс, а дочерний процесс завершается до того, как родительский вызовет waitpid
, то информация о статусе выхода, установленная waitpid
, действительна? Если да, то когда это становится недействительным; то есть, как я могу обеспечить, чтобы я мог вызвать waitpid
на дочернем pid и продолжать получать действительную информацию о статусе выхода через какое-то время, и как мне «очистить» (сообщите ОС, что меня больше не интересует информация о статусе выхода для готового дочернего процесса)?Имеет ли waitpid текущую информацию о статусе дочернего процесса, который уже вышел?
Я играл со следующим кодом, и выяснилось, что информация о статусе выхода действительна в течение как минимум нескольких секунд после того, как ребенок закончил, но я не знаю, как долго или как сообщить ОС, что я не будет вызывать waitpid
снова:
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t pid = fork();
if (pid < 0) {
fprintf(stderr, "Failed to fork\n");
return EXIT_FAILURE;
}
else if (pid == 0) { // code for child process
_exit(17);
}
else { // code for parent
sleep(3);
int status;
waitpid(pid, &status, 0);
waitpid(pid, &status, 0); // call `waitpid` again just to see if the first call had an effect
assert(WIFEXITED(status));
assert(WEXITSTATUS(status) == 17);
}
return EXIT_SUCCESS;
}
Действительно, второй вызов waitpid был неудачным. Я об этом не думал! Спасибо, что указали это. –