即使沒有讀者,如何寫入命名管道內容

即使沒有讀者,如何寫入命名管道內容

我有這個小測試腳本:

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")

但我不知道它的正確語法...我所知道的是我需要在第一個寫入呼叫區塊之前打開它進行讀取。上面的好像不行。

相關內容