Mam płytę CD na żywo, która uruchamia się w systemie Linux i uruchamia mały skrypt Bash. Skrypt wyszukuje i uruchamia drugi program (zwykle jest to skompilowany plik binarny C ++).
Powinieneś być w stanie przerwać drugi program, naciskając Ctrl+ C. To, co powinno się stać, to zatrzymanie drugiego programu, a skrypt Bash kontynuuje czyszczenie. Tak naprawdę dzieje się tak, że zarówno główna aplikacja, jak i skrypt Bash kończą się. Co jest problemem.
Więc użyłem trap
wbudowanego polecenia, aby powiedzieć Bashowi, aby zignorował SIGINT. A teraz Ctrl+ Ckończy aplikację C ++, ale Bash kontynuuje działanie. Świetny.
O tak ... Czasami „druga aplikacja” to kolejny skrypt Bash. I w takim przypadku Ctrl+ Cteraz nic nie robi .
Najwyraźniej moje rozumienie tego, jak to działa, jest błędne ... Jak kontrolować, który proces otrzymuje SIGINT, gdy użytkownik naciśnie Ctrl+ C? Chcę skierować ten sygnał tylko na jeden konkretny proces .
set -m
. Jest to trochę czystsze i prostsze niż używanie zasetsid
każdym razem, gdy prowadzisz dziecko.Jak wspomniałem w komentarzu do f01, powinieneś wysyłać SIGTERM do procesu potomnego. Oto kilka skryptów, które pokazują, jak przechwytywać ^ C i wysyłać sygnał do procesu potomnego.
Najpierw rodzic.
traptest
A teraz dziecko.
zapadka
Jeśli traptest wysyła SIGTERM, rzeczy zachowują się ładnie, ale jeśli traptest wysyła SIGINT, wtedy pętla nie widzi tego.
Jeśli pętla uśpienia wychwytuje SIGTERM, a tryb uśpienia jest na pierwszym planie, nie może zareagować na sygnał, dopóki nie obudzi się z bieżącego snu. Ale jeśli tryb uśpienia jest w tle, zareaguje natychmiast.
źródło
W twoim skrypcie inicjującym bash.
śledzić PID drugiego programu
złap SIGINT
gdy złapiesz SIGINT, wyślij SIGINT do drugiego programu PID
źródło