使用 Node.js 从 'named pipe' / fifo 读取
Read from a 'named pipe' / fifo with 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());
});
我启动 Node.js 进程,然后写入命名管道。由于某种原因,数据回调中似乎没有数据到达。
我正在这样写命名管道:
mkfifo NAMEDPIPEIN
echo "foo bar baz" > NAMEDPIPEIN
应该这样做:
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(超过线程池中的线程数),您打开的第一个 FIFO 将不再是流数据。这是因为 fs
模块并非设计用于在非阻塞模式下使用文件描述符。相反,使用 net
模块!
从 开始,当前从 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 ...
});
});
总而言之,如果您是 运行 脚本并且不介意占用线程池中的一个线程,则可以使用 的解决方案。否则,您绝对应该使用此解决方案。
我有这个:
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 进程,然后写入命名管道。由于某种原因,数据回调中似乎没有数据到达。
我正在这样写命名管道:
mkfifo NAMEDPIPEIN
echo "foo bar baz" > NAMEDPIPEIN
应该这样做:
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(超过线程池中的线程数),您打开的第一个 FIFO 将不再是流数据。这是因为 fs
模块并非设计用于在非阻塞模式下使用文件描述符。相反,使用 net
模块!
从
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 ...
});
});
总而言之,如果您是 运行 脚本并且不介意占用线程池中的一个线程,则可以使用