2012-01-26 37 views
1

时,我有以下的Node.js代码:Node.js的FIFO - 过程挂起写文件描述符

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”。

请帮忙!

回答

3

的问题是,当回声退出时,FIFO将相继命中“文件”的结束,所以你readstream会发出“结束”事件和读取流将关闭文件描述符,不再接受更多数据。

如果在两端有两个长寿命的过程如果FIFO,那么它不会是一个问题,但由于回声写,然后关闭,它很快将停止节点流。

你最好的选择可能是刚刚重新创建流时的电流流火“结束”。

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

+0

嗨,非常感谢那个见解。我想我将使用unix套接字来代替我的Node.js程序和我的C程序之间的通信。 – Eamorr

3

下面是一个使用终端测试串流一个简单的方法:

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

答案很可能是有点晚了,但可能是其他人需要了解的。