명명된 파이프에서 임의의 프로세스를 읽는 경우:
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이 반환 되면 read
0바이트를 읽은 것이며 대부분의 프로그램은 이를 파일 끝으로 해석합니다.
fsync
프로그램은 (2)를 사용하여 버퍼가 가득 차기 전에 파이프의 한쪽을 플러시할 수 있습니다. 이 경우 판독기는 read
버퍼가 비어 있어도 즉시 반환하고 읽은 바이트 수로 0을 반환합니다.
를 실행하여 이를 관찰할 수 있습니다 cat
. 일부 문자를 입력하고(반환하지 않고) Ctrl-D를 누릅니다(이렇게 하면 터미널이 새로 고쳐집니다). 이때 cat
입력한 문자가 인쇄됩니다. Ctrl-D를 다시 누르면 파일 끝에 도달했다고 가정하고 cat
's는 read
0바이트를 반환합니다 . cat
라인 버퍼링 때문에 cat
Return 키를 누르면 입력 내용도 인쇄됩니다.