명명된 파이프에 아무것도 없고 다음을 수행합니다.
cat my_named_pipe
데이터가 도착할 때까지 기다립니다. 읽을 데이터가 없을 경우 플래그를 사용하여 즉시 종료할 수 있나요? 아니면 cat 이외의 명령을 사용할 수도 있나요?
나는 또한 다음을 시도했습니다.
read val < "$my_named_pipe";
그러나 이것은 또한 다음 데이터 덩어리를 기다릴 것입니다. fifo가 비어 있으면 기다리고 싶지 않습니다.
답변1
작성기가 없는 정지를 방지하려면 cat
(이 경우 FIFO를 열지 않고 정지하는 경우) 다음을 수행할 수 있습니다.
cat 0<> "$my_named_pipe" <"$my_named_pipe"
첫 번째 리디렉션은 읽기+쓰기 모드로 열립니다. 이 모드는 대부분의 시스템에서 작성자나 판독기가 없더라도 파이프를 차단하거나 인스턴스화하지 않습니다. 그런 다음 두 번째 열기(이번에는 읽기 전용)는 이제 최소한 하나의 작성자(자체)가 있으므로 차단되지 않습니다.
기본 fd가 0에서 1로 변경된 ksh93의 최신 버전에서만 0
필요합니다 .<>
또한 쉘 내장에서는 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
s -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
표준 출력으로 인쇄됩니다.
아마도 가장 깨끗한 솔루션은 아니지만 작업을 완료할 수 있습니다.
도움이 되었기를 바랍니다.