【问题标题】:Why I am getting "print() on closed filehandle with bad file descriptor" in my Perl script?为什么在我的 Perl 脚本中出现“带有错误文件描述符的已关闭文件句柄上的 print()”?
【发布时间】:2012-05-06 23:08:44
【问题描述】:

我在 Perl(5.0 版本 8 版本 0)中有一个 TCP 服务器,它使用这个子例程来登录文件。

sub logger {
  return if ($LOGFILE eq "") ;
  my ($idt, $str) = @_ ;
  unless( defined($str) ) {
    $str = $idt ;
    $idt = '' ;
  }
  my ($s,$m,$h,$J,$M,$A) = localtime(time()) ;
  if(!open(OUT,">>$LOGFILE")) {
    warn "logger:error open [$LOGFILE]:[$!]\n";
    return;
  }
  if (!printf OUT "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %s %s -> %s\n",
          $A+1900, $M+1, $J, $h, $m, $s, $idt, $HOSTNAME, $str) {
    warn "logger:error print [$LOGFILE]:[$!]\n";
    return;
  }
  if (!close(OUT)) {
    warn "logger:error close [$LOGFILE]:[$!]\n";
    return;
  }
}

所以在这个日志文件中有同时写入。 异常,我在 STDERR 中有这个错误:

printf() 在关闭的文件句柄上

logger :error print [/my/path/logFile.LOG]:[Bad File Descriptor]

打开没有任何错误!

我该如何解决这个问题?

【问题讨论】:

  • 5.8 在 5.8.0 之后有 9 个维护版本。您是否尝试过升级到 5.8.9? (为 5.8.0 编译的模块可以与 5.8.9 一起使用。)
  • Perl 5.8.0 发布于 10 年前。连5.8.9都超过3岁了。
  • 我知道...但我现在无法升级它。
  • 在修订版 5 版本 10 颠覆 1 上也是如此

标签: perl filehandle


【解决方案1】:

OUT 是一个全局包。假设升级到真正的日志系统(例如 Log4perl)是不可能的,您可以使用名为 $OUT 的词法文件句柄:

sub logger {
    $LOGFILE or return;
    my ($idt, $str) = @_ ;

    unless( defined($str) ) {
        $str = $idt ;
        $idt = '' ;
    }

    my ($s,$m,$h,$J,$M,$A) = localtime(time()) ;

    my $OUT;

    unless (open $OUT, '>>', $LOGFILE) {
        warn "logger:error open [$LOGFILE]:[$!]\n";
        return;
    }

    unless (printf $OUT 
        "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %s %s -> %s\n",
        $A+1900, $M+1, $J, $h, $m, $s, $idt, $HOSTNAME, $str
    ) {
        warn "logger:error print [$LOGFILE]:[$!]\n";
        return;
    }

    unless (close $OUT) {
        warn "logger:error close [$LOGFILE]:[$!]\n";
        return;
    }

    return 1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多