![即使没有读者,如何向命名管道写入内容](https://linux22.com/image/154765/%E5%8D%B3%E4%BD%BF%E6%B2%A1%E6%9C%89%E8%AF%BB%E8%80%85%EF%BC%8C%E5%A6%82%E4%BD%95%E5%90%91%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93%E5%86%99%E5%85%A5%E5%86%85%E5%AE%B9.png)
我有这个小测试脚本:
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")
但我不知道它的正确语法...我所知道的是我需要在第一个写入调用块之前打开它进行读取。上面的好像不行。