Pourquoi interrompre le processus ruby avec un enfant créé en utilisant l'appel à system
n'interrompt pas le processus ruby lui-même? Ils devraient appartenir au même groupe, donc ils devraient tous les deux être interrompus. De plus, ceci n'est pas valide pour ruby2.0.Interrompre l'enfant appelé à partir de ruby
Compte tenu de rubis 1.8.7 Patch 371, rubis 1.9.3 Patch 392 et patch ruby2.0 0:
Exécution ruby1.8 -e 'system "sleep 100"; p $?; sleep'
en bash et en appuyant sur ^C ne tue que l'appel intérieur à sleep 100
.
Ruby 1.9 se comporte de manière identique.
Bien que l'exécution ruby2.0 -e 'system "sleep 100"; p $?; sleep'
interruptions à la fois intérieure et commande processus ruby itself.2.0.0-p0
--EDIT--
sources lecture que j'ai trouvé que la manipulation SIGINT
, SIGQUIT
et SIGHUP
est commuté à ignoré dans la méthode rb_syswait
qui attend que le sous-processus créé se termine et restaure les gestionnaires (rb_syswait
dans ruby v1.8.7-p370, ruby v1.9.3-p362 et sans bloquer les gestionnaires dans ruby v2.0.0-p0).
Pourquoi est-il fait et pourquoi seulement pour system
et IO.popen
, pas %x{}
ou fork{}
?
Voulez-vous connaître les détails de mise en œuvre ou comment contourner ce problème? –
@SemyonPerepelitsa: les deux + ce qui devrait être considéré comme un comportement normal – tig
@SemyonPerepelitsa maintenant seulement pourquoi est-ce fait et meilleures solutions de contournement – tig