2013-03-13 111 views
11

我试图写入命名管道,使用mkfifo。但是当我运行命令时,(ex)ls > myNamedPipe,我不能再输入命令到bash中。我仍然可以编写角色,这就是它。无法写入命名管道

回答

18

命名管道保持打开状态,直到您从其他位置读取它为止。这是为了允许不同进程之间的通信。

尝试:

mkfifo fifo 
echo "foo" > fifo 

然后打开另一个终端类型:

cat fifo 

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

参见什么用反向happends:

# 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 
+0

非常感谢!谢谢一堆! – tay10r 2013-03-13 04:38:51

+0

谢谢 - 这很好用!你能解释我为什么吗?我不太清楚'exec 3 <> fifo'行如何修复东西.. – Joost 2013-12-06 13:53:33

+4

将fifo连接到文件描述符会导致shell缓冲写入fifo的数据。没有它,任何对fifo的写入都会阻塞,直到读取写入的内容为止。使用文件描述符,shell会缓存“foo”和“bar”,并且任何从该文件描述符读取的内容都可以在稍后读取它们。 – chepner 2014-01-17 15:21:25