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

Nodejs child process exit before stdio streams close

我刚刚对子进程进行了试验,并注意到退出事件在关闭事件之前触发 - 以下代码抛出错误,因为 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());

文档指出:

"Note that when the 'exit' event is triggered, child process stdio streams might still be open."

请问这是怎么回事,为什么进程退出后流还存在?他们如何获得 'closed',这部分是由 OS 处理的,还是节点关闭了剩余的 stdio 流?

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

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

简而言之,stdio可以被其他还没有退出的进程使用。

我没有查看代码本身,但 OS 处理关闭 stdio 流的部分是有意义的。考虑将 stdio 输送到多个进程中(使用 tee 进行输送可能是一个很好的例子)。

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