명명된 파이프 블록에 쓰는지 어떻게 알 수 있나요?

명명된 파이프 블록에 쓰는지 어떻게 알 수 있나요?

이미 판독기가 있는 경우에만 명명된 파이프에 쓰고 싶습니다. 현재 timeout파이프에 쓰기 시도가 차단되었는지 감지하기 위해 사용하고 있는 방법은 다음과 같습니다.

#! /usr/bin/env bash
rm -f pipe
mkfifo pipe
sleep 5

timeout 1 bash -c "echo Hello > pipe"

if [[ $? == 0 ]]
then
    echo Somebody got our message
else
    echo Nobody read from pipe, so we didn\'t send a message
fi

이것은 작동합니다. 수면 중에 별도의 터미널을 사용 하면 tail -f pipe메시지를 받고, 그렇지 않으면 다른 메시지를 받습니다. 하지만 더 좋은 방법이 있나요? 이상적으로는 시간 초과에 의존하지 않는 것이어야 합니다.

답변1

파이프에 쓰려는 경우 일부 프로세스가 읽기 위해 파이프를 여는 경우에만 쓰기 위해 비차단 모드로 열 수 있습니다.

GNU 사용 dd:

echo Hello | dd oflag=nonblock of=pipe status=none &&
  echo message has been sent

ENXIO로부터 오류 메시지를 받게 됩니다.해당 장치 또는 주소가 없습니다.영어) 독자가 없을 경우.

또한 실패할 것입니다( EWOULDBLOCK/ 사용 EAGAIN,리소스를 일시적으로 사용할 수 없습니다.) 파이프가 가득 찬 경우(리더가 있지만 현재 읽지 않고 64KiB와 같은 것을 쓴 경우)

또한, 맞지 않을 경우 모든 메시지를 작성할 수 없다는 점도 참고하세요. 삭제된 경우 status=none얼마나 기록되었는지 확인할 수 있습니다.

관련 정보