Programmo che ho scritto in C fork () è un processo figlio. Nessuno dei due processi terminerà. Se lancio il programma dalla riga di comando e premo control-c quale processo (i) riceverà il segnale di interruzione?
Programmo che ho scritto in C fork () è un processo figlio. Nessuno dei due processi terminerà. Se lancio il programma dalla riga di comando e premo control-c quale processo (i) riceverà il segnale di interruzione?
Risposte:
Perché non lo proviamo e vediamo? Ecco un programma banale che utilizza signal(3)
per intercettare SIGINT
sia il processo padre che figlio e stampare un messaggio che identifica il processo quando arriva.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
if (!fork()) {
signal(SIGINT, &child_trap);
sleep(1000);
exit(0);
}
signal(SIGINT, &parent_trap);
sleep(1000);
return 0;
}
Chiamiamolo così test.c
. Ora possiamo eseguirlo:
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
I segnali di interruzione generati nel terminale vengono inviati al gruppo di processo attivo, che qui include sia padre che figlio . Si può vedere che sia child_trap
e parent_trap
sono stati giustiziati quando ho premuto Ctrl- C.
C'è una lunga discussione sulle interazioni tra fork
e segnali in POSIX . La parte più materiale qui è che:
Un segnale inviato al gruppo di processi dopo il fork () deve essere consegnato sia al genitore che al figlio.
Notano anche che alcuni sistemi potrebbero non comportarsi esattamente nel modo corretto, in particolare quando il segnale arriva molto vicino al tempo di fork()
. Capire se stai usando uno di quei sistemi probabilmente richiederà la lettura del codice o molta fortuna, perché le interazioni sono vanamente improbabili in ogni singolo tentativo.
Altri punti utili sono che:
kill
) verrà consegnato solo a quel processo, indipendentemente dal fatto che sia il genitore o il figlio.SIGINT
codice (comportamento predefinito).