Nodejs子进程在stdio流关闭之前退出



我刚刚对子进程进行了实验,注意到退出事件在关闭事件之前触发,因此下面的代码抛出了一个错误_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流已经关闭。

相关内容

  • 没有找到相关文章

最新更新