在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的主要内容,如果未能解决你的问题,请参考以下文章