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

时间:2012-01-26 13:08:30

标签: node.js file file-descriptor 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时,“Hello”就可以了。但是当我再次尝试时,echo "Hello" > n2c挂起,node.js窗口中没有任何内容。

我该如何解决这个问题?我希望能够将“Hello”回显到node.js窗口ad-infinitum。

请帮忙!

2 个答案:

答案 0 :(得分:4)

以下是使用终端测试流的简便方法:

$ 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.

当您返回时,流将为每个行提供节点,并且在您执行Ctrl + D或以其他方式发送EOF字符之前不会切断。

您的echo在一行之后死亡的原因是因为它会在您输入任何内容后自动发送EOF。

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

答案 1 :(得分:3)

问题在于,当echo退出时,fifo将触及'file'的末尾,因此你的readstream将发出'end'事件,而read流将关闭文件描述符并且不再接受更多数据

如果fifo的两端都有两个长期存在的进程,那么它就不会成为问题,但是由于echo写入然后关闭,它会快速停止节点流。

您最好的选择可能只是在当前流触发“结束”时重新创建流。

不确定是否有更好的方法。

相关问题