私は、Apache cgiスクリプトがオープンするために開いているすべてのファイルハンドルを閉じなければならない問題を追跡しました。私はこの問題をParse :: RecDescentに追跡しました。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;
}
私の質問は、開いているパッケージファイルハンドルをすべて見つける方法です。
私はfileno
が開いているファイルハンドルのカウンタを返すことを知っています。 これらの逆引き参照を行う方法、またはfileno
カウンタでファイルハンドルを閉じる方法はありますか?
私はこれの単純さが大好きです。 – CoffeeMonster
@ikegami:close-on-execフラグについて:Perlの 'open()'は、 '$^F'の値を使って、新しくオープンされたファイルがclose-on-execフラグを設定するかどうかを決定します。 '$^F'はstdin、stdout、stderrの" cutoff "値を表します。' $^F 'の上にあるファイル記述子は 'open()' _の時刻にclose-on-execビットを設定します。 stdin、stdout、stderrはスクリプトの実行前に開かれているので、 '$^F'は' exec() '中に閉じても影響を与えません。 (ちなみに、これはデフォルトで '$^F = 2'として' STDIN'、 'STDOUT'、' STDERR'だけを閉じることが必要であることを意味しています) – sarnold
@sarnold、$^Fについて話すのは素晴らしいです。それは私が欠けていたビットです。私はIPC :: Open3のコードを書いてからハンドルについてclose-on-execを設定して以来、私はこれについてもっと知っていると思うでしょう! – ikegami