即使没有读者,如何向命名管道写入内容

即使没有读者,如何向命名管道写入内容

我有这个小测试脚本:

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

但我不知道它的正确语法...我所知道的是我需要在第一个写入调用块之前打开它进行读取。上面的好像不行。

相关内容