Wenn ich einen untergeordneten Prozess fork
bin und der untergeordnete Prozess beendet wird, bevor der übergeordnete Benutzer waitpid
aufruft, ist die Exit-Statusinformation, die von waitpid
festgelegt wurde, noch gültig? Wenn ja, wann wird es ungültig? Wie kann ich sicherstellen, dass ich waitpid
auf der Child-PID aufrufen kann und nach einer beliebigen Zeit noch gültige Exit-Statusinformationen abrufen kann, und wie kann ich "aufräumen" (dem Betriebssystem mitteilen, dass ich nicht mehr an der Statusinformationen für den fertigen Kindprozess beenden)?Liefert waitpid gültige Statusinformationen für einen untergeordneten Prozess, der bereits beendet wurde?
Ich spielte mit dem folgenden Code, und es scheint, dass die Exit-Statusinformationen für ein paar Sekunden gültig sind, nachdem das Kind fertig ist, aber ich weiß nicht, wie lange oder wie ich das Betriebssystem informieren soll wird waitpid
nicht wieder anrufen:
#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;
}
Tatsächlich war der zweite 'waitpid' Aufruf fehlgeschlagen. Daran habe ich nicht gedacht! Vielen Dank, dass Sie darauf hingewiesen haben. –