Non waitpid produrre informazioni sullo stato valido per un processo figlio che è già uscito?

StackOverflow https://stackoverflow.com/questions/2865640

  •  30-09-2019
  •  | 
  •  

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;
}
È stato utile?

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ì.

pagina man :

  

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top