如何在perl程序中查找开放的全局文件句柄

Cof*_*ter 5 perl filehandle

我刚刚找到了一个问题,我必须关闭所有打开的文件句柄才能继续我的Apache cgi脚本.我将问题追溯到Parse :: RecDescent.

#!/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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何找到所有打开包文件句柄?

我知道fileno会返回一个打开文件句柄的计数器.有没有办法对它们进行反向查找,或者通过fileno计数器关闭文件句柄?

ike*_*ami 9

在某些系统上,返回的目录"/proc/$$/fd/"包含打开的文件描述符列表.你可以POSIX::close用来关闭它们.

# close all filehandles
for (glob "/proc/$$/fd/*") { POSIX::close($1) if m{/(\d+)$}; }
Run Code Online (Sandbox Code Playgroud)

  • @ikegami:关于close-on-exec标志:Perl的`open()`将使用`$ ^ F`的值来确定新打开的文件是否会设置close-on-exec标志.`$ ^ F`表示stdin,stdout,stderr"cutoff"值 - 在`$ ^ F`之上的文件描述符得到'open()`_时的close-on-exec位.(不是'exec()`时间.)由于stdin,stdout和stderr被打开_before_执行脚本,如果在`exec()`期间它们被关闭,`$ ^ F`将不会受到影响.(顺便说一句,我读到这意味着默认只关闭`STDIN`,`STDOUT`和`STDERR`作为`$ ^ F = 2`.) (3认同)
  • @ikegami:每次使用Perl时我都会学到新东西.(我担心我每次都会重新学习新东西,但那是另一回事...) (2认同)