Node.js FIFO – 写入文件描述符时进程挂起

我有以下Node.js代码:

var fs=require('fs'); var util=require('util'); var n2c=fs.createReadStream('./n2c'); var c2n=fs.createReadStream('./c2n'); n2c.on('data', function(b){ util.puts(b); }); c2n.on('data',function(b){ util.puts(b); }); 

正如你所看到的,我有两个FIFO文件描述符(使用: mkfifo n2cmkfifo c2nchmod 777 n2c c2n

当我在另一个窗口中echo "Hello" > n2c时,“你好”出现了。 但是,当我尝试再次做到这一点, echo "Hello" > n2c挂起,没有什么出现在node.js窗口。

我该如何解决? 我希望能够在ad-infinitum的node.js窗口中回显“Hello”。

请帮忙!

问题是,当echo退出时,fifo将会碰到“文件”的末尾,所以你的readstream会发出'end'事件,读取stream会closures文件描述符,不再接受更多的数据。

如果在fifo的两端都有两个长期的进程,那么这不会是一个问题,但是由于echo会写入然后closures,所以会快速停止节点stream。

您最好的select可能是只要当前stream触发“结束”就重新创buildstream。

不知道是否有更好的方法。

以下是使用terminaltestingstream的简单方法:

 $ cat > n2c Here you can type stuff that will be streamed whenever you add a newline. You can send EOF (end of file) by pressing Ctrl+D. 

当你返回时,这个stream将为每一行提供节点,直到你按Ctrl + D或以其他方式发送EOF字符时,它才会被切断。

你的echo在一行之后死亡的原因是因为它会在你键入任何东西之后自动发送EOF。

答案可能有点晚,但可能对其他人有用。