Ho bisogno di timeout su uno script che sta bloccando io.
Sorprendentemente si scopre exit
si blocca se non v'è un tubo aperto a un sottoprocesso:Perl: la chiusura della sottoprocesso nel gestore di segnale si blocca?
#!/usr/bin/perl
(-f "foo") || die "file foo doesn't exist";
open(IN, "tail -f foo |");
$SIG{ALRM} = sub
{
print "trying to exit...\n";
exit 0; # Hangs with above open() call
};
alarm 1;
while (1)
{
sleep 5; # Do stuff ...
}
Senza open
chiamata funziona, purtroppo la rimozione non è un'opzione in questo caso lo script ha bisogno.
Sembra exit
sta cercando di chiudere il filehandle e questo è ciò che è appeso:
$SIG{ALRM} = sub
{
print "trying to close...\n";
close(IN); # Hangs ...
print "ok\n";
exit 0;
};
Credo che non sia troppo felice di cogliere il bambino da dentro un gestore di segnale ...
fa qualcuno conosce un buon modo per aggirare questo?
Certo che hai perfettamente ragione, stupido! La parte confusa era che una "uscita" iniziale funziona davvero, ma solo perché crea una condizione di competizione (il bambino non è ancora pronto). Grazie ! – lemonsqueeze