Non waitpid produrre informazioni sullo stato valido per un processo figlio che è già uscito?
Domanda
Se io fork
un processo figlio, e le uscite di processo figlio prima che il genitore chiamate waitpid
, allora è l'informazione stato di uscita che viene impostato dal waitpid
ancora valido? Se è così, quando lo fa non diventi valida; vale a dire, come faccio in modo che posso chiamare waitpid
sul pid bambino e continuare ad ottenere informazioni di stato di uscita valida dopo una quantità arbitraria di tempo, e come faccio a "clean up" (dire al sistema operativo che io non sono interessato più nel informazioni di stato di uscita per il processo figlio finito)?
I stava giocando in giro con il seguente codice, e sembra che le informazioni di stato di uscita è valida per almeno un paio di secondi dopo le finiture bambino, ma non so per quanto tempo o il modo di informare il sistema operativo che ho vinto 't essere chiamando di nuovo 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;
}
Soluzione
Sì, waitpid
funzionerà dopo che il bambino è uscito. Il sistema operativo non mancherà di tenere la voce un processo figlio nella tabella dei processi (compresi stato di uscita) intorno fino a quando chiama il genitore waitpid
(o un'altra funzione wait
-familiare) o fino a quando le uscite genitore (a questo punto lo stato viene raccolto dal processo init
) . Questo è ciò che un processo "zombie" è:. Un processo che è uscito da è ancora residente nella tabella dei processi proprio per questo scopo
L'ingresso di processo nella tabella dovrebbe andare via dopo la prima chiamata a waitpid
. Ho il sospetto che la ragione per cui nel tuo esempio ti sembra di essere in grado di chiamare waitpid
due volte è semplicemente perché waitpid
non modificherà l'argomento status
se pid
non esiste più. Così la prima chiamata dovrebbe essere al lavoro e compilando status
, e la seconda chiamata dovrebbe essere restituisce un codice di errore e non cambiare status
. Lo si può verificare controllando i valori di ritorno delle chiamate waitpid
e / o utilizzando due diverse variabili status
.
Altri suggerimenti
Il sistema operativo continua a processo terminato in un zombie stato fino al suo genitore (che potrebbe essere il init
se il processo padre originale terminato prima) raccoglie che stato di uscita con chiamata di sistema wait(2)
. Quindi la risposta è -. Lo stato di uscita del processo di non diventa invalido
Sì.
Un figlio che termina, ma non ha stato atteso diventa uno "zombie". Il kernel mantiene un insieme minimo di informazioni sul processo di zombie (PID, stato di terminazione, risorsa informazioni di utilizzo) al fine di consentire il genitore per eseguire successivamente un'attesa a ottenere informazioni circa il bambino.