명명된 파이프에 EOF 보내기 - fifo 정리/건조

명명된 파이프에 EOF 보내기 - fifo 정리/건조

명명된 파이프에서 임의의 프로세스를 읽는 경우:

tail -f MYNAMEDPIPED 
cat MYNAMEDPIPE | someOtherProc

다른 곳에서는 MYNAMEDPIPED를 이름으로 처리할 수 있습니다. MYNAMEDPIPED를 제거하거나 어떻게든 "건조"하여 꼬리 프로세스를 중지하는 안전하고 깨끗한 방법이 있습니까?

다시 말해서

MYNAMEDPIPED.noMoreDataIsComingThroughSoPleaseStopTailingThis()

:)

댓글 중 하나를 보면 EOF를 MYNAMEDPIPE로 보내라고 나와 있습니다. 하지만 어떻게 해야할지 모르겠습니다.

이것은 내가 직면하고 있는 어려움을 보여줍니다.

http://comp.os.linux.questions.narkive.com/2AW9g5yn/sending-an-eof-to-a-named-pipe

답변1

EOF캐릭터가 아니다또한 일부 지속적인 도시 전설에서 알 수 있듯이 파이프를 통해 전송되거나 기록 끝까지 "공급"될 수 있는 "이벤트"도 아닙니다.

이것오직EOF파이프/FIFO의 읽기 측에서 생성하는 방법(즉, read(2)0을 반환함)은 쓰기 측에서 열려 있는 모든 핸들을 닫는 것입니다.

이는 쓰기 모드에서 명명된 파이프를 연 모든 프로세스와 파일 설명자를 상속한 모든 하위 프로세스가 fork()종료되는 경우 자동으로 발생합니다[1].

read(2)예를 들어, 파이프가 읽기/쓰기 모드로 열린 경우 명명된 파이프의 a가 0을 반환하는 것은 불가능합니다. 그리고

exec 7<>/path/to/fifo

이 경우 파이프 양쪽 끝에 파일 설명자/핸들이 있고 쓰기 끝을 닫으면 읽기 끝도 닫혀서 a가 read(2)0을 반환하는 것이 불가능하기 때문입니다(파이프는 어떤 종류의 반 닫기도 지원하지 않습니다) , 소켓은 ) 및 shutdown(2))을 지원하지 않습니다.

SCM_RIGHTS[1] 유닉스 소켓의 보조 메시지를 통해 파일 설명자를 수신하는 모든 프로세스.


참고하세요tail -f 정의에 따르면EOF읽는 파일이 일반 파일인지 특수 파일인지에 관계없이 에서 종료되지 않습니다 . 파일 설명자에 대한 열린 핸들을 보유하고 있는 모든 프로세스를 종료하는 한 가지 방법은 다음과 같습니다 fuser(1).

tail -f /path/to/fifo
...
> /path/to/fifo  # let any blocking open(2) through
fuser -TERM -k /path/to/fifo

/path/to/fifo이는 (의도하지 않게) 부모로부터 열린 핸들을 상속하는 프로세스 도 종료한다는 점에 유의하세요 .

답변2

"EOF를 보낼" 수 없습니다. "EOF 문자"는 파이프를 전혀 통과하지 않습니다.

일반적으로 Linux 프로그램은 차단 모드에서 (2)를 사용하여 파일 설명자에서 데이터를 읽고 read, 수신된 데이터로 버퍼를 채우고, 읽은 문자 수를 반환합니다. 0이 반환 되면 read0바이트를 읽은 것이며 대부분의 프로그램은 이를 파일 끝으로 해석합니다.

fsync프로그램은 (2)를 사용하여 버퍼가 가득 차기 전에 파이프의 한쪽을 플러시할 수 있습니다. 이 경우 판독기는 read버퍼가 비어 있어도 즉시 반환하고 읽은 바이트 수로 0을 반환합니다.

를 실행하여 이를 관찰할 수 있습니다 cat. 일부 문자를 입력하고(반환하지 않고) Ctrl-D를 누릅니다(이렇게 하면 터미널이 새로 고쳐집니다). 이때 cat입력한 문자가 인쇄됩니다. Ctrl-D를 다시 누르면 파일 끝에 도달했다고 가정하고 cat's는 read0바이트를 반환합니다 . cat라인 버퍼링 때문에 catReturn 키를 누르면 입력 내용도 인쇄됩니다.

관련 정보