Différence entre ChildProcess fermer, quitter événements
Quand la ponte des processus enfants via spawn()/exec()/...
dans Node.js, il y a un 'close'
et un 'exit'
événement sur les processus enfants.
Quelle est la différence entre les deux et quand devez-vous utiliser quoi?
Vous devez vous connecter pour publier un commentaire.
Avant Node.js 0.7.7, il n'y avait qu'une "sortie" de l'événement sur les processus enfants (et pas de "fermer" l'événement). Cet événement est déclenché lorsque le processus de l'enfant a quitté, et tous les flux (stdin, stdout, stdout) ont été fermés.
Dans Le Nœud 0.7.7, le "proche" de l'événement a été introduite (voir commettre).
Le documentation (permalink) actuellement dit:
Si vous venez de lancer un programme et de ne pas faire quelque chose de spécial avec stdio, le "proche" événement se déclenche après la "sortie".
Le "proche" de l'événement peut être retardée si par exemple le flux stdout est transmise à un autre flux. Cela signifie donc que la "proximité" de l'événement peut être retardée (indéfiniment) après la "sortie" de l'événement.
Est-ce à dire que la "proximité" de l'événement est toujours déclenché après la "sortie"? Comme le montrent les exemples ci-dessous montrent, la réponse est non.
Donc, si vous vous intéressez seulement à la fin du processus (par exemple, parce que le processus est titulaire d'une ressource exclusive), à l'écoute de "sortie" est suffisante.
Si vous n'avez pas de soins sur le programme, et seulement à propos de son entrée et/ou sortie, utilisez le bouton "fermer" de l'événement.
Expérience: détruire stdio avant de tuer l'enfant
Expérimentalement (en Node.js v7.2.0), j'ai trouvé que si la stdio les flux ne sont pas utilisés par le processus de l'enfant, que puis "fermer" événement n'est déclenché une fois que le programme s'est terminé:
Le programme ci-dessus frai "sommeil" sorties:
Quand je change les premières lignes d'un programme de sorties seulement,
... alors la sortie est:
De même quand je change de frayer un programme qui lit uniquement à partir de stdin,
Ou quand j'ai lu sur l'entrée standard et la sortie vers stdout,
Expérience: programme Pipe à l'autre, tuer en premier programme
L'expérience précédente est tout à fait artificielle. L'expérience suivante est un peu plus réaliste: Vous dirigez un programme à l'autre et de tuer le premier.
De sortie:
De même, lorsque le premier programme ne lit que de l'entrée et de ne jamais sorties:
Lorsque le premier programme de garde de la sortie sans attendre pour stdin, le comportement est différent, comme l'expérience suivante montre.
Expérience: Pipe programme avec beaucoup de sortie à l'autre, tuer en premier programme
Le programme ci-dessus affiche ce qui suit, puis se ferme:
la version courte est, "exit" émet quand l'enfant sort mais la stdio sont pas encore fermé.
'fermer' émet quand l'enfant a quitté et son stdios sont fermés.
D'ailleurs qu'ils partagent la même signature.
Avez-vous regarder la documentation?
Selon cette:
'Fermer' événement est émis lorsque le stdio flux d'un processus enfant ont été fermés. Elle est distincte de la "sortie" de l'événement, depuis plusieurs processus partagent le même stdio flux.
La "sortie" de l'événement est émis après le processus fils se termine. Si le processus de sortie, le code est le dernier code de sortie du processus, null sinon. Si le processus s'est terminé en raison de la réception d'un signal, ce signal est le nom de la chaîne du signal, null sinon. L'un des deux sera toujours non nulle.
Note that when the 'exit' event is triggered, child process stdio streams might still be open.