2

我正在使用 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中读取命名管道?还是可以读取命名管道的包?

4

2 回答 2

4

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

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

像这样开始:

node app.js < /tmp/FIFOFILE

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

于 2013-05-22T15:03:38.137 回答
1

当最后一个进程完成写入 FIFO 时,操作系统将发送 EOF。如果只有一个进程正在写入 FIFO,那么当该进程完成写入其内容时,您会得到一个 EOF。此 EOF 触发 Node 关闭流。

@JoshuaWalsh 在此答案中给出了避免这种情况的技巧,即:您自己打开管道进行阅读和写作——即使您无意写信给它。这意味着操作系统会看到至少有一个进程写入文件,因此您永远不会得到 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());
}
于 2020-09-09T00:47:42.840 回答