Właśnie odkryłem problem, w którym musiałem zamknąć wszystkie otwarte uchwyty plików dla mojego skryptu Apache cgi, aby kontynuować. Prześledziłem problem w Parse :: RecDescent.Jak znaleźć otwarte globalne uchwyty plików w programie perla
#!/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;
}
Moje pytanie brzmi: jak znaleźć wszystkie otwarte uchwyty plików?
Wiem, że fileno
zwróci licznik otwartej uchwytu pliku. Czy istnieje sposób, aby wykonać do nich odwrócone wyszukiwanie lub zamknąć uchwyty plików za pomocą ich licznika fileno
?
Uwielbiam prostotę tego. – CoffeeMonster
@ikegami: Informacje na temat flagi close-on-exec: 'open()' Perla używa wartości '$^F', aby określić, czy nowo otwarte pliki będą miały ustawioną flagę close-on-exec. '$^F' reprezentuje wartość" cutoff "stdin, stdout, stderr - deskryptory plików powyżej' $^F' pobierają zestaw bitów close-on-exec _at czas 'open()' _. (Nie "exec()' czas.) Ponieważ stdin, stdout i stderr są otwierane _ przed wykonaniem skryptu, '$^F' nie wpłynie, jeśli zostaną zamknięte podczas' exec() '. (Nawiasem mówiąc, przeczytałem to w ten sposób, że zamykanie tylko 'STDIN',' STDOUT' i 'STDERR' jest konieczne jako' $^F = 2' domyślnie.) – sarnold
@sarnold, Wspaniale, gdy mówię o $^F. Tego właśnie mi brakowało. Można by pomyśleć, że wiem o tym więcej, odkąd napisałem kod w IPC :: Open3, który ustawia close-on-exec na uchwycie! – ikegami