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

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

명명된 파이프에 아무것도 없고 다음을 수행합니다.

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의 이전 대상을 별도의 파일 설명자에 저장하여 파이프를 열어 둡니다. 다음을 작성하여 이 문제를 해결할 수 있습니다.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파이프에 쓰는 것이 읽을 수 있는 것보다 느린 경우 일부 작성자의 출력을 놓칠 수 있음을 의미합니다.

또 다른 접근 방식은 일정 기간 동안 입력이 없을 때 시간 초과를 수행하는 것입니다(예: socats -T옵션 사용).

socat -u -T1 - - 0<> "$my_named_pipe" <"$my_named_pipe"

1초 동안 파이프에서 아무 것도 나오지 않으면 빠져 나옵니다.

답변2

아주 간단한 방법은 cat데이터가 있든 없든 fifo를 읽은 후 즉시 종료하는 것입니다. 다음을 사용하여 이 작업을 수행할 수 있습니다 timeout.

timeout 2 cat my_named_pipe

위에서는 timeoutcat을 강제로 종료하기 전에 2초 정도 기다립니다. 런타임 시 명명된 파이프에 버퍼링된 콘텐츠가 있으면 cat표준 출력으로 인쇄됩니다.

아마도 가장 깨끗한 솔루션은 아니지만 작업을 완료할 수 있습니다.

도움이 되었기를 바랍니다.

관련 정보