dlaczego dwukrotne wpisanie Ctrl + c zatrzymałoby uruchomiony proces w systemie Linux?


24

Istnieją programy Linux, na przykład vlc, które zalecają dwukrotne naciśnięcie ctrl+, caby zabić ich wykonanie z terminala, jeśli program nie zatrzymał się po pierwszym.

Dlaczego pisanie ctrl+ cdwa razy działa, gdy pierwszy raz nie działa?


6
[potrzebne źródło]
Ignacio Vazquez-Abrams

Odpowiedzi:


35

To, co robi, jest całkowicie zależne od aplikacji. Po naciśnięciu przycisku ctrl+ cemulator terminala wysyła sygnał SIGINT do aplikacji pierwszego planu, co wyzwala odpowiedni „moduł obsługi sygnału”. Domyślna procedura obsługi sygnału dla SIGINT zamyka aplikację. Ale każdy program może zainstalować własną procedurę obsługi sygnału dla SIGINT (w tym procedurę obsługi sygnału, która wcale nie zatrzymuje wykonywania).

Najwyraźniej vlc instaluje moduł obsługi sygnału, który próbuje wykonać pewne czyszczenie / zakończenie z gracją przy pierwszym wywołaniu, i wraca do domyślnego zachowania natychmiastowego kończenia wykonania, gdy jest wywoływany po raz drugi.


3
W niektórych systemach sygnał powraca do SIG_DFL po wywołaniu procedury obsługi (aby uniknąć dwukrotnego wywołania procedury obsługi tego samego sygnału); nazywa się to semantyką SysV. Wiele programów nie przywraca funkcji obsługi sygnału do pierwotnych ustawień w programie na końcu procedury obsługi. Zwykle byłby to błąd programistyczny. Przeczytaj więcej informacji na stronie man (2) sygnału .
Arcege

16

SIGINT , sygnał wysyłany przez Ctrl+ C, konwencjonalnie nakazuje programowi włamać się do głównej pętli przetwarzania poleceń lub, jeśli to nie ma sensu, aby wyjść czysto. Niektóre programy uruchamiają procedurę czyszczenia po otrzymaniu SIGINT. Jeśli program jest tak pomieszany, że procedura czyszczenia kończy się niepowodzeniem, w niektórych programach sekunda Ctrl+ Cpowoduje natychmiastowe zamknięcie programu. Od tego zależy każdy autor programu.

Jeśli drugi Ctrl+ Cnie zabije program, spróbuj Ctrl+ \, który wysyła SIGQUIT , bardziej brutalne (ale wciąż połów sygnał) lub spróbuj Ctrl+ Zdo zawieszenia programu, a następnie killpolecenie (np kill %1który wysyła SIGTERM , konwencjonalnie mniej gwałtowny sygnał niż SIGQUIT, do zadania nr 1). Jeśli wszystko inne zawiedzie, zabij program kill -KILL, zwany także kill -9wysyłaniem niekontrolowanego sygnału SIGKILL .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.