2016-04-01 12 views
2

Ich habe gerade mit Child-Prozesse experimentiert und festgestellt, dass das Exit-Ereignis vor dem Schließen-Ereignis ausgelöst wird - der folgende Code löst einen Fehler aus, da this._instance.stdin nicht mehr existiert. _instance ist bereits null).Nodejs untergeordneten Prozess beenden, bevor stdio Streams schließen

'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()); 

In der Dokumentation:

„Man beachte, dass, wenn das‚exit‘Ereignis ausgelöst wird, Strom stdio Kind-Prozesses noch offen sein könnte.“

Ich fragte mich, wie das passiert, warum gibt es die Ströme noch, nachdem der Prozess beendet wurde? Und wie werden sie "geschlossen", wird dieser Teil vom Betriebssystem behandelt oder macht der Knoten das Schließen der übrig gebliebenen STDIO-Streams?

In der Praxis würde ich this._instance nicht unbedingt auf null setzen, da es nicht so nett zu sein scheint und offensichtlich zu früh ist.

Antwort

1

Die Dokumentation der close event wirft Licht darauf, warum dies passieren könnte.

Kurz gesagt, kann das stdio von anderen Prozessen verwendet werden, die noch nicht beendet wurden.

Ich habe nicht in den Code selbst geschaut, aber es würde Sinn machen, dass das OS den Teil des Schließens der STDIO-Ströme handhabt. Denken Sie daran, das System in mehrere Prozesse zu leiten (Piping mit tee könnte ein gutes Beispiel sein).

Im vorliegenden Fall würde ich vermuten, dass Sie nicht einmal end() Stdin benötigen, da das close Ereignis darauf hindeutet, dass der Standard-Stream bereits geschlossen wurde.