Ho appena rintracciato un problema in cui dovevo chiudere tutti i filehandle aperti per il mio script cgi Apache per continuare. Ho tracciato il problema su Parse :: RecDescent.Come trovare filehandle globali aperti in un programma perl
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
$|++;
print "Content-Type: text/plain\n\n";
use Parse::RecDescent;
say "$$: pre-fork: ". time;
if(my $pid = fork) {
# parent
say "$$: return immediately: ". time;
}
else {
# child
say "$$: kicked off big process: ". time;
close STDIN;
close STDOUT;
close STDERR;
# close *{'Parse::RecDescent::ERROR'};
sleep 5;
}
La mia domanda è: come trovare tutti i filehandle aperti del pacchetto?
So che fileno
restituirà un contatore per un filehandle aperto. C'è un modo per fare una ricerca inversa per questi, o chiudere filehandle dal loro contatore fileno
?
Amo la semplicità di questo. – CoffeeMonster
@ikegami: informazioni sul flag close-on-exec: 'open()' di Perl utilizzerà il valore di $^F per determinare se i file appena aperti avranno il flag close-on-exec impostato. Il '$^F' rappresenta il valore di stdin, stdout, stderr" cutoff "- i descrittori di file sopra' $^F' ottengono il bit del bit close-on-exec _at al momento di 'open()' _. (Non 'exec()' time.) Poiché stdin, stdout e stderr sono aperti _prima dell'esecuzione dello script, '$^F' non influenzerà se sono chiusi durante' exec() '. (Per inciso, ho letto questo per significare che la chiusura solo di 'STDIN',' STDOUT' e 'STDERR' è necessaria come' $^F = 2' di default.) – sarnold
@sarnold, Awesome per aver parlato di $^F. Questo è il pezzo che mi mancava. Penseresti che ne saprei di più da quando ho scritto il codice in IPC :: Open3 che imposta close-on-exec su un handle! – ikegami