如果我fork
是子进程,并且子进程在父调用之前退出waitpid
,那么设置的退出状态信息是否waitpid
仍然有效?如果是,什么时候变得无效;即,如何确保我可以调用waitpid
子 pid 并在任意时间后继续获取有效的退出状态信息,以及如何“清理”(告诉操作系统我不再对退出感兴趣已完成子进程的状态信息)?
我在玩下面的代码,似乎退出状态信息在孩子完成后至少几秒钟内有效,但我不知道多久或如何通知操作系统我不会再次调用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;
}