2012-04-13 3 views
1

아래 코드에서 p00mkfifo p00으로 만든 명명 된 파이프입니다.사용 가능한 경우 stdin에서 행을 읽는 방법 (다른 방법으로 차단)?

콘솔 1에서, I는 실행 :

% perl -ne 'print "PERL: $_"' < p00 

이어서, 반면 상기 I는 결과

% seq 3 > p00 

도망 콘솔 2 (예상) 블록은이 콘솔에 나타난 다음 1 :

PERL: 1 
PERL: 2 
PERL: 3 
% 

이것은 이었다 내가 홉 있었다 거의 결과 달성하기 위하여, 제 3의 선을 인쇄 한 후에 perl 원본이 끝났다는 사실을 제외하고는, 즉시 그렇지 않으면 사용할 수있게 및 블록을 :

나는 스크립트 ("PERL"접두어) 라인을 울리는 계속합니다.

한 - 라이너의 다음 변형 위의 피상적 원하는 동작과 유사합니다

perl -e 'while (1) { print "PERL: $_" while <>; sleep 1 }' < p00 

을 ...하지만 입력을 기다리는 동안은 차단하지 않습니다 있기 때문에, 실제 거래 아니다, 사용할 수있게되자 마자 그 입력을 되풀이하지도 않는다.

참고 :

  1. 이 질문 뒤에 동기는 교육 (광산, 즉)와 불과하다; 실용적인 문제를 풀려고하지 않습니다. 나는 더 많은 펄 (유닉스)을 배우려고하고있다.
  2. 이 질문이 unix.se.com에 더 적합한 지 확실하지 않았습니다. 나는 그곳에 다시 게시하게되어 기쁘다. 바로 알려주세요.
+4

이것은 'fifo'가 동작하는 방식입니다. 일단 writer가 그것을 닫으면, 독자는'EOF'를 얻습니다. 독자는 아마도 'fifo'를 다시 열어야하지만 쉘 리다이렉션으로는 할 수 없다. –

+0

@ MaximYegorushkin : 당신의 의견은 내가해야만하는 것이'sleep 1'을 없애는 것이라는 것을 깨달았습니다! 그런 다음 내가 게시 한 두 번째 버전이 원하는대로 정확하게 수행됩니다. 감사! – kjo

답변

1

Maxim Yegorushkin의 의견을 읽은 후에 나는 두 번째 버전에서 sleep 1을 제거해야한다는 것을 깨달았습니다. 즉,이 정확히 내가 원하는 않습니다 : 맥심 쓴 것처럼

perl -e 'while (1) { print "PERL: $_" while <> }' < p00 

, 내부 루프가 EOF 수신시 종료; 외부 루프는 블로킹 상태로 스크립트를 반환하여 입력을 기다리고 있습니다 ... Doh!

+2

흥미 롭습니다. 'p00'가 FIFO 대신에 파일이라고 가정하십시오. 그런 다음 수정 된 스크립트는 추가 된 파일을 파일에 추가 할 때 추가 행을 읽습니다 (추가하려면'>>'을 사용하거나 파일을 다시 쓰고 이전보다 많은 행을 추가하십시오). 따라서 Perl은 새로운 읽기 전에 입력 스트림 (표준 입력)에서 EOF 표시기를 재설정합니다. –

관련 문제