계속해서 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 '위의 파일 디스크립터는'close()'_ 시간에 close-on-exec 비트를 설정합니다. ('exec()'시간이 아닙니다.) stdin, stdout, stderr는 스크립트 실행 전에 _ 열리 며'$^F'는'exec()'중에 닫히면 영향을 미치지 않습니다. (덧붙여서, 나는'STDIN','STDOUT' 및'STDERR' 만 기본값으로'$^F = 2'로 필요하다는 것을 알기 위해 이것을 읽었습니다.) – sarnold
@sarnold, 약 $^F에 관해서는 굉장합니다. 그게 내가 놓친 비트 야. 내가 핸들에 close-on-exec을 설정하는 코드를 IPC :: Open3에 작성한 이후로 나는 이것에 대해 더 많이 알고 있다고 생각할 것이다. – ikegami