2017-03-04 8 views
0

필자는 리눅스를 사용하고 있으며 원래 FIFO 파일의 경우 필자가 일부 내용을 덤프 할 때 필자는 읽기 피어가 해당 내용을 "모두"읽었을 때까지 기다릴 것이라고 예상했습니다. 하지만 예상대로되지 것 같다, 나는 간단한 실험을했다 : 나는 "몇 줄을 가지고하는"을 My.txt "파일을 가지고 다음linux fifo, 읽기 피어가 반환되면 피어도 즉시 반환됩니까?

$mkfifo hfifo.txt 

: 모든

첫째, 나는 FIFO 파일을 만든 : 에 읽기,

cat my.txt >hfifo.txt 

을 내가 다른 터미널 "에서 tty2"를 엽니 다

$cat my.txt 
line1 
line2 
line3 
line4 

은 내가 "tty1로"을 My.txt로 hfifo.txt에 쓰기를 엽니 다 그것에서 e 선 : 내 "tty1로"에서 "읽기"완료는 "고양이"로

내 supprise에 잘
$read l1<hfifo.txt 

은 즉시 반환합니다. 내가 "$ l1을 에코"하면 "line1"이 인쇄됩니다. 필자는 독자 피어가 FIFO에 기록 된 모든 내용을 읽어야하고 필자 피어 (tty1)가 반환 할 것으로 예상했기 때문에 이것은 나에게는 아주 이상합니다. 그러나 실제 결과는 독자 피어가 끝나면 피어 피어도 끝납니다.

난 그냥 궁금

(1) 어떻게 작가 피어가 완료하도록 FIFO를 더 이상 읽을 독자가 없다는 것을 알고? 루프에서이 파일의 각 행을 인쇄하는 "read"명령을 호출 할 수 있습니다.

(2) "cat"명령 옆에 FIFO를 덤프하는 명령이 있습니다. 셸 프로그래밍에서이 FIFO를 한 줄씩 읽는 방법이 있습니까?

감사합니다.

답변

1

'strace'가 편리합니다. 당신은 + 줄 바꿈 3 개 문자 파일의 다음 줄을 볼 수

read(3, "qqq\n", 131072) = 4 write(1, "qqq\n", 4) = 4 read(3, "", 131072) = 0

당신이 볼 수 있듯이, 모두 읽기() 및 write() 읽을 문자 수를 반환, 마지막 interation 리턴 제로에 , 이는 프로세스가 종료되었음을 알리는 신호입니다.

regardins (2) sed awk와 egrep 같은 파일을 한 줄씩 읽지 만 AFAIK 파일 만 읽는 명령이 있습니다.