2013-01-06 4 views
0

stdin에 FIFO를 사용하는 데 문제가 있습니다. 그런 다음FIFO에 문제가있는 입력 루프

#!/usr/bin/env ruby 
while true do 
    data = gets 
    puts "Got: #{data}" 
end 

나는 그것을 실행 좋아 :

Got: testdata 
Got: 
Got: 
Got: 
Got: 
Got: 
etc. 

내 의심 뭔가가 있다는 것이다 :

$ ./script < input.fifo & 
$ echo testdata > input.fifo 

그것은 뭔가를 인쇄합니다

는이 같은 스크립트가 있습니다 FIFO가 잘못되었습니다. 스크립트에 전송 된 후 무언가가 삭제되지 않습니다.

나는 (... "% d 개"참조)는 scanf를 사용하여 유사한 입력 루프와 C 프로그램과 같은 일을 시도하고이처럼 행동 :

$ echo 1 > input.fifo 
Got: 1 
Got: 1 
Got: 1 
Got: 1 
etc. 

그래서이 지난 것으로 보인다 FIFO에있는 물건이 거기에 갇히게됩니다. 루비 예제에서는 gets가 \ n을 포착하기 때문에 null 행입니다. 두 번째로 그것은 1 자체입니다.

아무도 통찰력을 제공 할 수 있습니까?

감사합니다.

답변

0

상황 후에 간단
'는 에코 1> input.fifo'파일 열린 'input.fifo'이 "1", 그것에
를 작성하고,이 폐쇄된다.

문제점은 닫혀 있다는 것입니다. 쓰기 측면에서 FIFO가 닫히면 읽기 측면에서 "파일 끝"과 동일합니다. 따라서 C 코드에서 "scanf"의 리턴 코드를 확인하면 EOF 상수와 같을 것입니다.

fifo에서 모든 데이터를 읽고 "read"코드를 읽으려고하면 "read"코드가 즉시 반환되고 "end of file"이보고됩니다.

+0

흠, 내가 틀린 도구를 사용하고 있습니다. 기본적으로 나는 사용자 입력을 스크립트로 보내고, 더 이상 입력이 없을 때 스크립트가 기다릴 수있는 무언가가 필요하다. 다른 것이 입력 파일에 추가되면 다음 행을 실행하려고합니다. 내가 어떻게 이럴 수 있니? – user1222728