Dlaczego przerywanie procesu ruby z dzieckiem utworzonym za pomocą połączenia z numerem system
nie przerywa samego procesu ruby? Powinny należeć do tej samej grupy, więc należy je przerwać. Również nie jest to poprawne dla ruby2.0.Dziecko przerywane wywołane z ruby
Biorąc Ruby 1.8.7 łata 371, Ruby 1.9.3 łata 392 i ruby2.0 łata 0:
Running ruby1.8 -e 'system "sleep 100"; p $?; sleep'
w bash i naciskając ^C zabija tylko wewnętrzne wezwanie do sleep 100
.
Ruby 1.9 zachowuje się identycznie.
Choć działa ruby2.0 -e 'system "sleep 100"; p $?; sleep'
przerwań zarówno wewnętrzny proces dowodzenia i rubin itself.2.0.0-P0
--EDIT--
Czytając źródła Odkryłam, że obsługa SIGINT
, SIGQUIT
i SIGHUP
jest przełączono na zignorowanie w metodzie rb_syswait
, która czeka, aż utworzony proces podrzędny zakończy działanie, a następnie przywróci procedury obsługi (rb_syswait
w ruby v1.8.7-p370, ruby v1.9.3-p362 i bez blokowania procedur obsługi w ruby v2.0.0-p0).
Dlaczego to się robi i dlaczego tylko dla system
i IO.popen
, nie %x{}
lub fork{}
?
Czy chcesz poznać szczegóły implementacji lub jak obejść ten problem? –
@ SemyonPerepelitsa: zarówno + co powinno być uważane za normalne zachowanie – tig
@ SiemioPerepelitsa teraz tylko dlaczego jest zrobione i najlepsze obejścia – tig