기다리지 않고 명명된 파이프를 고양이하는 방법

기다리지 않고 명명된 파이프를 고양이하는 방법

명명된 파이프에 아무것도 없고 다음을 수행하는 경우:

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의 이전 대상을 별도의 파일 설명자에 저장합니다. 파이프를 열어 두십시오. 대신 다음과 같이 작성하여 이 문제를 해결할 수 있습니다.catksh93/opt/ast/bin/bin$PATHbuiltin 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

위에서는 timeoutcat을 강제 종료하기 전에 2초 동안 기다립니다. 를 실행할 때 명명된 파이프에 버퍼링된 내용이 있으면 catstdout에 인쇄됩니다.

아마도 가장 깨끗한 솔루션은 아니지만 작업을 수행합니다.

도움이 되길 바랍니다.

관련 정보