我有這個小測試腳本:
rm fooo | cat
mkfifo fooo
echo 'bar' > fooo # blocks here
echo 'done'
我猜測,因為沒有人從命名管道中讀取數據,所以寫入呼叫將在此之前阻塞。
即使沒有讀者,是否有某種方法可以寫入或檢查是否沒有讀者?
答案1
根據https://man7.org/linux/man-pages/man7/fifo.7.html:
" 在 Linux 下,開啟 FIFO 進行讀取和寫入在阻塞和非阻塞模式下都會成功。POSIX 未定義此行為。這可用於在沒有可用讀取器時開啟 FIFO 進行寫入。使用 FIFO 兩端的進程為了與自身進行通信,連接應該非常小心,以避免死鎖。
答案2
一種解決方案是在同一行添加一個閱讀器:
echo "unlocked" > "$fifo" > >(read line; echo "$line")
但我不知道它的正確語法...我所知道的是我需要在第一個寫入呼叫區塊之前打開它進行讀取。上面的好像不行。