파이프를 닫은 후에도 파이프에서 계속 읽을 수 있습니까?


5

다음을 호출하는 ksh 스크립트가 있습니다.

while read LINE do...

파이프에서 입력을 읽도록 입력이 재 지정되었습니다 (표시되지 않음).

문제는 파이프에 대한 기록기가 닫힐 때 읽기가 false를 리턴하고 루프를 종료한다는 것입니다.

파이프를 닫은 후에도 계속 읽으려고합니다 (쓰기 프로세스가 때때로 다시 시작 되어이 상황이 발생할 수 있음).

전체 읽기 LINE을 하위 셸 내에서 래핑하고 전체 하위 셸을 반복하려고 시도했지만 스크립트가 정상적으로 시작될 때처럼 입력이 더 많이있을 때까지 파이프가 닫힌 후 빈 줄을 읽습니다.

답변:


6

파이프는 커널에서 두 프로세스 간의 통신 방법으로 작성됩니다. 일반적으로 부모 / 자식 관계입니다. 프로세스가 종료되면 파이프가 없습니다. 커널에서 파이프의 다른 쪽 끝에 다른 프로세스를 연결하는 방법은 없습니다. 커널은 파이프에서 자동으로 종료를 시작하고 모든 독자에게 EPIPE를 제공합니다.

당신이 할 수있는 일은 명명 된 파이프를 만드는 것 입니다. 파일 시스템에 존재하며 기록기 프로그램을 종료 할 때 닫히지 않습니다. 파이프에 여러 명의 작성자를 가질 수도 있지만 제안하지는 않지만 작성중인 '청크'는 버퍼링으로 인해 다른 청크로 작성됩니다.

알려진 디렉토리에 파이프를 작성하고 mkfifo /path/to/pipe독자 또는 작성자인지 여부에 따라 stdin 또는 stdout을 파이프로 리디렉션합니다.


0

파이프가 닫히면 다시 열 수 없습니다. 파일 시스템의 명명 된 파이프에 대한 모든 세부 사항을 알지 못하지만 파이프 cat somefile.txt | myprogramcat닫 자마자 다음과 같은 작업을 수행 하면 파이프가 사라집니다.


>파이프가 아닙니다. 출력 리디렉션 지정자입니다.
amphetamachine 2016 년

@ amphetamachine : 후 oop. 그것을
발견해
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.