我有这个小测试脚本:
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")
但我不知道它的正确语法...我所知道的是我需要在第一个写入调用块之前打开它进行读取。上面的好像不行。