无法向命名管道写入数据

14

我正在尝试向使用mkfifo创建的命名管道写入数据。但是,当我运行命令(ex) ls > myNamedPipe时,我不能再在bash中输入命令了。我仍然可以输入字符,但就这些。

1个回答

22
一个命名管道会一直保持打开状态,直到你从其他地方读取它。这是为了允许不同进程之间的通信。
尝试:
mkfifo fifo
echo "foo" > fifo

然后打开另一个终端窗口,输入:

Then open another terminal and type:

->

然后打开另一个终端窗口,输入:

cat fifo

如果您返回到第一个终端,您会注意到现在可以输入其他命令。

同时也看看反向操作会发生什么:

# terminal 1
cat fifo

# terminal 2
echo "foo" > fifo

# and now you can see "foo" on terminal 1

如果您希望在尝试向FIFO写入内容时终端不会“挂起”,请将文件描述符附加到FIFO:

mkfifo fifo
exec 3<> fifo
echo "foo" > fifo
echo "bar" > fifo

谢谢 - 这个很好用!但是你能解释一下为什么吗?我不太明白 exec 3<> fifo 这行代码是怎么修复的。 - Joost
5
将 fifo 与文件描述符连接会导致 shell 缓冲写入到 fifo 的数据。如果没有它,对 fifo 的任何写操作都会被阻塞,直到有读取操作。通过使用文件描述符,"foo" 和 "bar" 由 shell 进行缓冲,任何从该文件描述符读取的内容都可以在以后读取。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接