GNU/Linux >> Linux Esercitazione >  >> Linux

Il processo figlio riceve il SIGINT del genitore

Se stai generando il file SIGINT con Ctrl +C su un sistema Unix, il segnale viene inviato all'intero gruppo di processi.

Devi utilizzare setpgid o setsid per inserire il processo figlio in un gruppo di processi diverso in modo che non riceva i segnali generati dal terminale di controllo.

[Modifica:]

Assicurati di leggere la sezione RAZIONALE del setpgid pagina con attenzione. È un po' complicato collegare qui tutte le potenziali condizioni di gara.

Per garantire al 100% che nessun SIGINT verrà consegnato al tuo processo figlio, devi fare qualcosa del genere:

#define CHECK(x) if(!(x)) { perror(#x " failed"); abort(); /* or whatever */ }
/* Block SIGINT. */
sigset_t mask, omask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
CHECK(sigprocmask(SIG_BLOCK, &mask, &omask) == 0);

/* Spawn child. */
pid_t child_pid = fork();
CHECK(child_pid >= 0);
if (child_pid == 0) {
    /* Child */
    CHECK(setpgid(0, 0) == 0);
    execl(...);
    abort();
}
/* Parent */
if (setpgid(child_pid, child_pid) < 0 && errno != EACCES)
    abort(); /* or whatever */
/* Unblock SIGINT */
CHECK(sigprocmask(SIG_SETMASK, &omask, NULL) == 0);

A rigor di termini, ognuno di questi passaggi è necessario. Devi bloccare il segnale nel caso in cui l'utente prema Ctrl +C subito dopo la chiamata a fork . Devi chiamare setpgid nel bambino nel caso in cui il execl accade prima che il genitore abbia il tempo di fare qualsiasi cosa. Devi chiamare setpgid nel genitore nel caso in cui il genitore corre e qualcuno preme Ctrl +C prima del bambino ha tempo per fare qualsiasi cosa.

La sequenza sopra è goffa, ma gestisce il 100% delle condizioni di gara.


Linux
  1. Perché il Pgid dei processi figlio non è il Pid del genitore?

  2. Come funziona il ciclo di vita dei processi Linux:processo padre, figlio e inizializzazione

  3. Come far morire il processo figlio dopo che il genitore è uscito?

  4. Come imposto la directory di lavoro del processo genitore?

  5. Perché il processo figlio è ancora vivo dopo che il processo genitore è stato ucciso in Linux?

Ottieni in modo programmatico il pid genitore di un altro processo?

Come uccidere il processo di zombi

Come ottenere il processo figlio dal processo padre

Come uccidere un processo figlio python creato con subprocess.check_output() quando il genitore muore?

Perché non posso terminare questo processo su Linux?

Come terminare un processo <defunct> con il genitore 1