【问题标题】:Read from a 'named pipe' / fifo with Node.js使用 Node.js 从“命名管道”/fifo 读取
【发布时间】:2017-12-12 10:39:13
【问题描述】:

我有这个:

  const p = path.resolve(projectRoot + '/NAMEDPIPEIN');
  const fd = fs.openSync(p, 'r+');

  fs.createReadStream(null, {fd}).on('data', function (d) {
    if (String(d).trim() === '[stdin end]') {
      return process.nextTick(cb);
    }
    process.argv.push(String(d).trim());
  });

我启动 Node.js 进程,然后写入命名管道。由于某种原因,on data 回调中似乎没有数据到达。

我正在写这样的命名管道:

 mkfifo NAMEDPIPEIN
 echo "foo bar baz" > NAMEDPIPEIN

【问题讨论】:

  • 你试过this suggestion for Linux吗?
  • 谢谢,现在试试...想知道它是否可以在 mac 上运行
  • 根据该线程,它(很可能)在 Linux 以外的任何地方都无法工作。
  • 您的代码在我的 Mac 上运行良好(因为每当我将一些数据写入命名管道时,data 事件就会触发)。顺便说一句,child_process.spawn() 不是您想要做的任何事情的解决方案吗?
  • 就我而言,我有一个守护进程。我需要向守护进程发送一些命令。据我所知,在 macos 和 linux 上执行 IPC 的最简单方法是命名管道。不过,这并不容易。

标签: node.js linux bash macos named-pipes


【解决方案1】:

来自@richardpringle 的其他解决方案应该可以工作,但功能有限。

如果您尝试以这种方式打开多个 FIFO(超过线程池中的线程数),您打开的第一个 FIFO 将不再是流数据。这是因为fs 模块不是为在非阻塞模式下使用文件描述符而设计的。相反,请使用net 模块!

来自https://stackoverflow.com/a/52622722/1843507,当前从 FIFO 实现流式传输的方法是使用套接字:

const fs = require('fs');
const net = require('net');

fs.open('path/to/fifo/', fs.constants.O_RDONLY | fs.constants.O_NONBLOCK, (err, fd) => {
  // Handle err
  const pipe = new net.Socket({ fd });
  // Now `pipe` is a stream that can be used for reading from the FIFO.
  pipe.on('data', (data) => {
    // process data ...
  });
});

总而言之,如果您正在运行脚本并且不介意在线程池中绑定其中一个线程,则可以使用@richardpringle 的解决方案。否则,您绝对应该使用此解决方案。

【讨论】:

  • 您可以使用 O_RDWR 和 openSync 使其成为一个快速同步函数来替换 fs.create*Stream
【解决方案2】:

应该这样做:

const fs = require('fs');
const path = require('path');

const fifoPath = path.resolve(projectRoot, '/NAMEDPIPEIN')

const fifo = fs.createReadStream(fifoPath);

fifo.on('data', data => {
  // process data...
});

使用fifo.on('data', console.log) 进行测试。

【讨论】:

  • 我也推荐使用fifo.setEncoding('utf8')设置文件流编码
  • 如果您向命名管道写入一次,之后它似乎停止工作
  • 查看@Sami 的答案,它更强大!
  • 既然你只是用.on('data'),那我用.pipe()也行吗?
  • 是的,它只是 ReadableStream 的一个实例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多