在NodeJS中将可读流关闭到FIFO

Posted

技术标签:

【中文标题】在NodeJS中将可读流关闭到FIFO【英文标题】:Close readable stream to FIFO in NodeJS 【发布时间】:2015-09-25 23:51:18 【问题描述】:

我正在为 nodejs 中的 linux fifo 创建一个可读流,如下所示:

var stream = FS.createReadStream('fifo');

这一切都很好,我可以很好地接收来自 fifo 的数据。 我的问题是我想要一种方法来轻轻关闭我的软件,因此我需要以某种方式关闭此流。

打电话

process.exit();

没有任何效果,因为流被阻塞了。

我还尝试通过调用未记录的方法stream.close() 以及stream.destroy() 手动销毁流,如in the answers of this question 所述。

我知道我可以使用process.kill(process.pid, 'SIGKILL') 杀死我自己的进程,但这感觉就像一个非常糟糕的黑客攻击,并且可能对文件系统或数据库产生不良影响。

难道没有更好的方法来实现这一点吗?

您可以尝试这个最小示例来重现我的问题:

var FS = require('fs');
console.log("Creating readable stream on fifo ...");
var stream = FS.createReadStream('fifo');
stream.once('close', function() 
    console.log("The close event was emitted.");
);
stream.close();
stream.destroy();
process.exit();

使用mkfifo fifo 创建一个名为“fifo”的先进先出后。

如何修改上述代码以正确关闭软件?

【问题讨论】:

像这样创建流:stream = FS.createReadStream('fifo', flags : 'r+'); 然后像这样关闭它 var c = FS.createWriteStream('fifo'); c.write('\0'); c.close(); stream.pause(); stream.close(); 有效,但感觉更像是一种肮脏的黑客攻击。 节点文档中有解释:nodejs.org/dist/latest-v11.x/docs/api/… 【参考方案1】:

显式写入命名管道会解除对读取操作的阻塞,例如:

require('child_process').execSync('echo "" > fifo');
process.exit();

【讨论】:

以上是关于在NodeJS中将可读流关闭到FIFO的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs可读流,解析二进制数据,保留顺序

无法使用一个可读流写入 Node JS 中的两个不同目标

NodeJS 难点(网络,文件)的 核心 stream 三:readable ?

管道传输到可写流时暂停可读流

JS 语音合成到 Node.JS 可读流

在nodeJs中将pm2与socket io集成[关闭]