gpt4 book ai didi

node.js - Nodejs 子进程在 stdio 流关闭之前退出

转载 作者:搜寻专家 更新时间:2023-11-01 00:00:21 25 4
gpt4 key购买 nike

我刚刚对子进程进行了试验,并注意到退出事件在关闭事件之前触发 - 以下代码会引发错误,因为 this._instance.stdin 不再存在(this._instance 已经为空)。

'use strict';

const spawn = require('child_process').spawn;

class Foo {
constructor() {
this._instance = null;
}

bar() {
this._instance = spawn('ls', ['-l']);

this._instance.on('close', (code, signal) => {
this._instance.stdin.end();
});

this._instance.on('exit', (code, signal) => {
this._instance = null;
});

return this._instance;
}
}


var foo = new Foo();

console.log(foo.bar());

文档指出:

“请注意,当‘退出’事件被触发时,子进程 stdio 流可能仍处于打开状态。”

我想知道这是怎么发生的,为什么进程退出后流仍然存在?它们是如何“关闭”的,这部分是由操作系统处理的,还是 Node 关闭了剩余的 stdio 流?

在实践中,我不一定会在退出时将 this._instance 设置为 null,因为这似乎不是一件好事,而且显然有点为时过早。

最佳答案

close event 的文档阐明了为什么会发生这种情况。

简而言之,stdio 可以被其他尚未退出的进程使用。

我没有研究代码本身,但操作系统处理关闭 stdio 流的部分是有意义的。考虑将 stdio 通过管道输送到多个进程中(使用 tee 进行管道输送可能是一个很好的例子)。

在目前的情况下,我怀疑您甚至不需要 end() stdin,因为 close 事件表明 stdin 流已经关闭。

关于node.js - Nodejs 子进程在 stdio 流关闭之前退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36354445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com