我刚刚对子进程进行了实验,注意到退出事件在关闭事件之前触发,因此下面的代码抛出了一个错误_instance.stdin已不存在(此.instance已为null)。
'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流可能仍然打开。"
我想知道这是怎么发生的,为什么流程退出后流仍然存在?它们是如何"关闭"的,这部分是由操作系统处理的,还是节点关闭剩余的stdio流?
在实践中,我不一定会设置这个_实例在退出时为null,因为这似乎不是一件好事,而且显然有点为时过早。
close
事件的文档揭示了为什么会发生这种情况。
简而言之,stdio可以由其他尚未退出的进程使用。
我还没有研究代码本身,但操作系统处理关闭stdio流的部分是有意义的。考虑将stdio管道化为多个进程(使用tee
管道化可能是一个很好的例子)。
在本例中,我怀疑您甚至不需要end()
stdin,因为close
事件表明stdin流已经关闭。