명명된 파이프에 아무것도 없고 다음을 수행하는 경우:
cat my_named_pipe
데이터가 도착할 때까지 기다립니다. 읽을 데이터가 없는 경우 즉시 종료하는 데 사용할 수 있는 플래그가 있습니까? 아니면 cat 이외의 명령을 사용할 수 있을까요?
나는 또한 다음을 시도했습니다.
read val < "$my_named_pipe";
그러나 이것은 또한 다음 데이터 덩어리를 기다립니다. FIFO가 비어 있으면 기다리고 싶지 않습니다.
답변1
작성자가 없을 때 중단되는 것을 방지하려면 cat
(이 경우 FIFO를 읽는 것이 아니라 FIFO를 여는 경우 중단됨) 다음을 수행할 수 있습니다.
cat 0<> "$my_named_pipe" <"$my_named_pipe"
첫 번째 리디렉션은 읽기+쓰기 모드로 열립니다. 이는 대부분의 시스템에서 이미 작성자나 리더가 없더라도 파이프를 차단하거나 인스턴스화하지 않습니다. 그러면 두 번째 열기(이번에는 읽기 전용)가 차단되지 않습니다. 현재(자체) 적어도 하나의 작성자가 있기 때문입니다.
이는 0
기본 fd가 <>
0에서 1로 변경된 최신 버전의 ksh93에서만 필요합니다.
또한 에서는 셸이 내장되어 있을 ksh93
때 작동하지 않습니다 . 예를 들어 가 호출 되기 전 이나 후에 호출될 때 와 같이 , (제 생각에는) ksh93은 stdin의 이전 대상을 별도의 파일 설명자에 저장합니다. 파이프를 열어 두십시오. 대신 다음과 같이 작성하여 이 문제를 해결할 수 있습니다.cat
ksh93
/opt/ast/bin
/bin
$PATH
builtin cat
<"$my_named_pipe"
cat 3<> "$my_named_pipe" <"$my_named_pipe" 3<&-
(의도를 더 명확하게 전달한다고 주장할 수도 있음)
<>
파이프에서는 fifo에 대한 다른 판독기의 잠금도 해제됩니다 .
일부 작성자가 있는 경우 cat
에도 모든 출력을 읽고 파이프 끝을 닫을 때까지 기다려야 합니다. GNU와 같이 비차단 모드로 파이프를 열 수 있습니다 dd
:
dd bs=64k if="$my_named_pipe" iflag=nonblock status=noxfer
데이터가 있는 경우에만 파이프에서 읽고 다음과 같이 종료됩니다.
dd: error reading 'fifo': Resource temporarily unavailable
더 이상 없으면 오류가 발생하고 다른 판독기를 잠금 해제하지 않습니다. 그러나 이는 파이프를 dd
읽는 것보다 파이프에 쓰는 것이 느린 경우 작성자의 출력 중 일부를 놓칠 수 있음을 의미합니다.
또 다른 접근 방식은 한동안 입력이 없을 때 시간 초과를 적용하는 것입니다. 예를 들어 socat
의 -T
옵션을 사용합니다.
socat -u -T1 - - 0<> "$my_named_pipe" <"$my_named_pipe"
1초 동안 파이프에서 아무 것도 나오지 않으면 종료됩니다.
답변2
cat
데이터 유무에 관계없이 FIFO를 읽은 후 즉시 종료하는 것이 매우 쉽습니다 . 다음과 같이 를 사용하여 이 작업을 수행할 수 있습니다 timeout
.
timeout 2 cat my_named_pipe
위에서는 timeout
cat을 강제 종료하기 전에 2초 동안 기다립니다. 를 실행할 때 명명된 파이프에 버퍼링된 내용이 있으면 cat
stdout에 인쇄됩니다.
아마도 가장 깨끗한 솔루션은 아니지만 작업을 수행합니다.
도움이 되길 바랍니다.