Unterschied zwischen ChildProcess close, exit-Ereignisse
Beim laichen Kind-Prozesse über spawn()/exec()/...
im Node.js es ist ein 'close'
und ein 'exit'
Veranstaltung auf Kind-Prozesse.
Was ist der Unterschied zwischen diesen beiden, und wenn Sie Sie verwenden müssen, was?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bevor Node.js 0.7.7, es war nur eine "exit" - Ereignis auf Kind-Prozesse (und keine "schließen" - Ereignis). Dieses Ereignis hätte ausgelöst werden, wenn der untergeordnete Prozess beendet wurde, und alle streams (stdin, stdout, stdout) geschlossen wurden.
Im Knoten 0.7.7, die "close" - event eingeführt (siehe commit).
Die Dokumentation (permalink) derzeit sagt:
Wenn du einfach spawn ein Programm und mache nichts besonderes mit der stdio, die "schließen" - Ereignis wird ausgelöst, nachdem "exit".
Die "schließen" - Ereignis kann verzögert werden, wenn z.B. die stdout-stream-Pipeline zu einem anderen stream. Das bedeutet also, dass der "schließen" - Ereignis verzögert werden können (auf unbestimmte Zeit) nach der "exit" - Ereignis.
Bedeutet das, dass der "schließen" - Ereignis wird immer ausgelöst, nachdem "exit"? Wie die Beispiele unten zeigen, die Antwort ist Nein.
Also, wenn Sie interessiert sind, nur den Prozess Kündigung (z.B. weil der Prozess besitzt eine exklusive Ressource) beim hören von "exit" ist ausreichend.
Wenn Sie nicht über das Programm, und nur über seine Eingabe und/oder Ausgabe verwenden Sie die "schließen" - Ereignis.
Experiment: zerstören stdio vor der Tötung Kind
Experimentell (in Node.js v7.2.0), ich fand, dass, wenn der stdio-streams werden nicht durch das Kind-Prozess, dann die "schließen" - Ereignis wird nur gefeuert, nachdem das Programm beendet wurde:
Dem oben genannten Programm laichen "Schlaf" - Ausgänge:
Wenn ich die ersten Zeilen für ein Programm, das nur Ausgänge,
... dann wird die Ausgabe ist:
Ähnlich, wenn ich spawn ein Programm, das nur liest von stdin,
Oder wenn ich lese von Standardeingabe und-Ausgabe auf stdout,
Experiment: Pipe-Programm zu einem anderen, töten erste Programm
Dem vorherigen experiment ist ziemlich künstlich. Der nächste Versuch ist ein wenig realistischer: leiten Sie ein Programm zu einem anderen und töten die erste.
Ausgabe:
Ähnlich, wenn Sie das erste Programm liest nur aus Eingabe-und nie-Ausgänge:
Wenn das erste Programm hält, ausgeben, ohne zu warten, für stdin, das Verhalten ist anders wenn es, wie der nächste Versuch zeigt.
Experiment: Pipe-Programm mit vielen Ausgaben zu anderen, töten erste Programm
Das obige Programm gibt Folgendes aus und wird dann beendet:
die kurze version ist, 'exit' sendet, wenn das Kind verlässt, aber der stdio sind noch nicht geschlossen.
'schließen' sendet, wenn das Kind beendet hat, und seine stdios geschlossen sind.
Außerdem, dass Sie die gleiche Signatur.
Haben Sie Blick auf die Dokumentation?
Laut diese:
Den "schließen" - Ereignis wird ausgelöst, wenn der stdio-streams von einem child-Prozess geschlossen worden. Dies unterscheidet sich von der "exit" - Ereignis, da mehrere Prozesse teilen die gleichen stdio streams.
Den 'exit' - Ereignis wird emittiert, nachdem der untergeordnete Prozess beendet wird. Wenn der Prozess beendet wurde, der code ist der Letzte exit-code des Prozesses, andernfalls null. Wenn der Prozess beendet durch den Empfang eines Signals, signal ist der string, der name des Signals, sonst null. Einer der beiden wird immer ungleich null.
Note that when the 'exit' event is triggered, child process stdio streams might still be open.