使用Node.js从“命名管道” / fifo中读取

Ale*_*lls 2 linux macos bash named-pipes node.js

我有这个:

  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());
  });
Run Code Online (Sandbox Code Playgroud)

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

我正在这样写命名管道:

 mkfifo NAMEDPIPEIN
 echo "foo bar baz" > NAMEDPIPEIN
Run Code Online (Sandbox Code Playgroud)

Sam*_*ami 5

来自@richardpringle的另一种解决方案应该起作用,但是面临一个问题。

如果您尝试以这种方式打开多个(超过4个)fifo,则您打开的第一个fifo将不再流式传输数据。

/sf/answers/3683590571/从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 ...
  });
});
Run Code Online (Sandbox Code Playgroud)