我有以下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 n2c
,mkfifo c2n
,chmod 777 n2c c2n
创建)
当我在另一个窗口中执行echo "Hello" > n2c
时,“Hello”就可以了。但是当我再次尝试时,echo "Hello" > n2c
挂起,node.js窗口中没有任何内容。
我该如何解决这个问题?我希望能够将“Hello”回显到node.js窗口ad-infinitum。
请帮忙!
答案 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写入然后关闭,它会快速停止节点流。
您最好的选择可能只是在当前流触发“结束”时重新创建流。
不确定是否有更好的方法。