node.js - 在 NodeJS 中可靠地读取 FIFO

标签 node.js fifo

我正在编写一个与第三方应用程序交互的 NodeJS 脚本。第三方应用程序将在文件打开期间将数据写入文件。我希望我的 NodeJS 应用程序能够实时接收这些数据。

我的脚本创建一个 fifo:

child_process.spawnSync('mkfifo', [pipePath]);

然后,它使用 child_process.spawn 启动第 3 方应用程序。最后,它从管道中读取。

let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDONLY);

let stream = fs.createReadStream(null, {fd: pipeHandle, autoClose: false});

stream.on('data', d => {
    console.log(d.length);
});

如果第 3 方应用程序可以运行,则此方法非常有效。但是,在某些情况下,第 3 方应用程序将退出而不写入文件/FIFO。在这种情况下,我的脚本中的 fs.open() 调用将永远阻塞。 (请参阅 GitHub 上的 this related issue)

为了解决这个问题,我使用了

let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);

这可以防止我的脚本在第 3 方应用程序失败时挂起,但现在“数据”事件永远不会被触发,即使第 3 方应用程序正常工作也是如此。我想知道使用 O_NONBLOCK 打开 FIFO 是否不算打开它进行读取?

我不确定解决此问题的最佳方法是什么。目前我正在考虑启动第 3 方应用程序,等待 10 秒,看看它是否仍在运行,然后打开 fifo 进行读取,因为如果第三方应用程序完全失败,它可能会很快失败。但这是一个黑客行为,所以我想知道更好的解决方案是什么。

谢谢!

最佳答案

当然,我一问问题就明白了。

let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDWR);

这会无阻塞地打开 fifo,因为它同时连接写入器和读取器。 fifo 可以有多个写入器,因此第 3 方应用程序仍然能够毫无问题地连接。

关于node.js - 在 NodeJS 中可靠地读取 FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492401/

相关文章:

c - 如何使用STM32F4从MAX30100读取FIFO数据

algorithm - 使用 LIFO 实现 FIFO

amazon-web-services - Eventbridge 和 SQS fifo 队列

javascript - 为什么 Node.JS 中这个函数没有首先加载?

node.js - 将 Node.js 应用程序作为后台进程启动

bash:一个简单的 FIFO(先进先出)队列

c - 如何分析这个FIFO程序呢?

javascript - 让 WebStorm 识别后端和前端 JavaScript 文件

node.js - Electron 关闭按钮不起作用

node.js - Node + ES6 类 : Setting up a set of cached objects