我使用
创建一个管道mkfifo /tmp/foo.pipe
现在,我想尝试从管道读取最多2秒,所以我执行
read -t 2 line < /tmp/foo.pipe
不会发生超时。读只是坐在那里等待管道的输入。
手册说'read'应该与命名管道一起使用。有谁知道为什么会这样?
ls -al /tmp/foo.pipe
prw-r----- 1 foo bar 0 Jun 22 19:06 /tmp/foo.pipe
答案 0 :(得分:18)
在调用read builtin之前,你的shell在open()调用时被阻塞。
在Linux上,您可以同时打开FIFO进行读写操作,以防止打开时阻塞;这是不可移植的,但可以做你想要的。
read -t 2 <>/tmp/foo.pipe
答案 1 :(得分:1)
如果您只想刷新(并丢弃)FIFO中的数据:
dd iflag=nonblock if=/tmp/foo.pipe of=/dev/null &> /dev/null
答案 2 :(得分:0)
你的shell是持有它的shell,它试图从管道中读取数据以将数据输入到read命令中,并且由于它没有得到任何东西它只是在那里等待。
答案 3 :(得分:-1)
TMOUT=2
read line < /tmp/foo.pipe