이미 판독기가 있는 경우에만 명명된 파이프에 쓰고 싶습니다. 현재 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
얼마나 기록되었는지 확인할 수 있습니다.