2012-05-06 2 views
3

이 서브 루틴을 사용하여 파일에 로그인하는 펄 (revision 5.0 version 8 subversion 0)에 tcp 서버가 있습니다.왜 Perl 스크립트에 "print()가 잘못된 파일 설명자가있는 닫힌 파일 핸들에서"나타납니다?

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() on closed filehandle 

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

!

이 문제를 어떻게 해결할 수 있습니까?

+0

5.8 5.8.0 이후 * 9 * maintainence 자료를했다 : 같은 Log4perl 같은 실제 로깅 시스템에 업그레이드를 가정하면 질문에서, 당신은 $OUT라는 어휘 파일 핸들을 사용할 수 있습니다. 5.8.9로 업그레이드를 시도 했습니까? (5.8.0 용으로 컴파일 된 모듈은 5.8.9와 함께 사용할 수 있습니다.) – ikegami

+0

Perl 5.8.0은 10 년 전에 출시되었습니다 *. 5.8.9조차도 3 세 이상입니다. – ephemient

+0

알아,하지만 지금은 업그레이드 할 수 없어. – user1334149

답변

3

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; 
} 
+0

내 문제는 해결되었습니다. – user1334149

+2

2-arg open, 나쁘다. 3-arg 오픈, 좋은! – ephemient