Che sta succedendo qui? Pensavo che SIGINT sarebbe stata inviata al gruppo di processi in primo piano.Perché SIGINT non viene catturato qui?
(penso, forse, che il sistema() è in esecuzione un guscio che sta creando un nuovo gruppo di processo per il processo figlio? Qualcuno può confermare?)
% perl
local $SIG{INT} = sub { print "caught signal\n"; };
system('sleep', '10');
Poi premere Ctrl + D poi Ctrl + c immediatamente e notare che il "segnale catturato" non viene mai stampato.
Mi sento come se fosse una cosa semplice ... ad ogni modo per aggirare questo problema? Il problema è che quando si esegue un gruppo di comandi tramite il sistema si ottiene tenendo premuto ctrl + c fino a quando tutte le iterazioni sono completate (perché perl non ottiene mai SIGINT) ed è piuttosto fastidioso ...
Come può essere risolto? (Ho già provato utilizzando fork() direttamente e capire che questo funziona ... questa non è una soluzione accettabile in questo momento)
UPDATE: si prega di notare, questo non ha nulla a che fare con "il sonno", solo il fatto che il comando impiega una quantità arbitraria di tempo per l'esecuzione che è considerevolmente maggiore di quella del perl attorno ad esso. Tanto che premendo ctrl + c viene inviato al comando (come nel gruppo di processi in primo piano?) E in qualche modo non viene mai inviato a perl.
ho bisogno di leggere la documentazione da capo: -/Grazie. – dlamotte
Aggiungo che il motivo per cui è necessario ispezionare il valore di ritorno del bambino è che la shell fornisce il^c/INT all'intero gruppo di processi, a perl e ai bambini, in questo caso terminando il figlio 'sleep 10'. Se semplicemente 'kill -INT $ perl_pid' da un'altra shell, perl sarà felice di chiamarti SIG_IGNore. – pilcrow