在node.js中尾随命名管道

时间:2013-05-22 12:31:37

标签: linux node.js socket.io

我正在使用node-tail在linux中读取文件并将其发送到套接字。

node.js发送从文本文件中读取的数据

var io = require('socket.io');
Tail = require('tail').Tail;


tail = new Tail("/tmp/test.txt");


io.sockets.on('connection', function (socket) {

tail.on("line", function(data) {
  socket.emit('Message', { test: data });

});

});

接收方

var socket = io.connect();
  socket.on('Message', function (data) {

    console.log(data.test);

  });

这有效,但当我尝试修改此部分时

tail = new Tail("/tmp/test.txt");

到这个

tail = new Tail("/tmp/FIFOFILE");

我无法从中获取任何数据。

无论如何在linux中读取命名管道?或者可以读取命名管道的包?

2 个答案:

答案 0 :(得分:3)

我可以让它以愚蠢的方式工作:

// app.js
process.stdin.resume();
process.stdin.on('data', function(chunk) {
 console.log('D', chunk);
});

从这样开始:

node app.js < /tmp/FIFOFILE

如果我为命名管道创建可读流,则在读取写入命名管道的第一个数据后结束。不确定为什么stdin很特别。

答案 1 :(得分:0)

当最后一个过程完成写入FIFO时,操作系统将发送EOF。如果只有一个进程正在写入FIFO,则当该进程完成其填充时,您将获得EOF。此EOF触发Node关闭流。

@JoshuaWalsh在this answer中给出了避免这种情况的窍门,即:即使您无意进行写入,也可以自己打开管道进行读取和写入。这意味着操作系统会看到始终有至少一个进程正在写入文件,因此您永远都无法获得EOF。

所以...只需添加以下内容:

let fifoHandle = fs.open(fifoPath, fs.constants.O_RDWR,function(){console.log('FIFO open')});

您无需对fifoHandle进行任何操作-只需确保它粘住并且不会收集到垃圾即可。

实际上...就我而言,我使用的是createReadStream,我发现仅将fs.constants.O_RDWR添加到其中就足够了(即使我无意写出fifo。

let fifo = fs.createReadStream(fifoPath,{flags: fs.constants.O_RDWR});

fifo.on('data',function(data){
    console.log('Got data:'+data.toString());
}