2017-02-16 6 views
1

나는 Perl을 사용하여 매우 간단한 프로세스를 수행하려고합니다. 코드 조각 :파이프 열기 및 Perl의 출력 구문 분석 지연

open(FH,"<command> |") or die "Could not run command .. $!\n"; 

print "After open\n"; 

while(<FH>) 
{ 
    print "I am inside loop\n"; 
    <process..something> 
} 

while()이 호출 될 때 일부 알 수없는 지연이 나타납니다. 나는 열기가 9-10ms (범위 내에 있음)를 취하는 것을 보았습니다. 그러나 "열린 후"와 "나는 내부 루프"라는 메시지 사이에서 200-250ms 지연을 봅니다.

누구나 전에 본 것과 같은 사람이 있습니까? 어떤 도움을 주시면 감사하겠습니다.

감사 Rajib 버퍼링되는 > < 명령의 출력 버퍼 중 하나가 채워질 때까지 또는 프로세스가 당신은 아마 unbuffer를 사용하여이 문제를 얻을 수 있습니다

종료하기 때문에 거의 확실하다

+1

음, 어떤 "_command_"를 실행하고 있습니까? ' '에 의해 읽혀진 어떤 것만이''while' '안에 들어가기 때문에, "_command_"가 무엇을하는지에 전적으로 달려있다. 2 초 동안 잠자기 후 인쇄하면 'while ()'이 2 초 동안 그 자리에 앉을 것입니다. – zdim

+1

어휘 파일 핸들 ('my $ fh')과 3 개의 인수'open'이 권장되며, 더 좋습니다. – zdim

+0

나는 데이터베이스 출력 명령 db2pd -db -active를 실행하고있다. (프로그램 외부에서 시도해 보면) 출력은 거의 즉각적으로 발생한다. – rssarkar

답변

1

, 어떤 단자에 출력하는 명령을 가장합니다.

대신 사용해보세요

open my $fh, '-|', 'unbuffer <command>' or die "Could not run command: $!\n"; 
+0

고마워요. 나는 모든 도움에 정말로 감사한다. zdim이 open()의 3 가지 옵션 형식을 사용 하자는 제안을 한 후에, 시간은 150-160ms까지 내려 갔지만 Borodin의 명령을 사용했을 때 30-35ms로 떨어졌습니다 !! – rssarkar

+0

마지막으로 사용한 코드는 다음과 같습니다. open $ FH, '- |', '버퍼 풀 db2pd -db $ db -active 2>/dev/null'또는 die "명령을 실행할 수 없습니다 .. $! \ n "; 2 :/dev/null을 사용하여 로그 파일에 sh : unbuffer not found 오류 메시지를 제거했습니다. 모든 도움을 주셔서 다시 한 번 감사드립니다. – rssarkar

+0

@rssarkar : 괜찮아 보입니다. ***에서 *** 대신에 *** 명령을 사용하여 파이프를 열고 있습니다. 그러면 'unbuffer not found'메시지가 나타나서는 안됩니다. 시스템에 버퍼가 없다고 확신합니까? – Borodin