Czy kilkakrotne naciśnięcie ctrl-c powoduje szybsze zamknięcie działającego programu?

41

Często zaczynam czytać ogromny plik, a potem po pewnym czasie chcę wyjść, ale od naciśnięcia przycisku
Ctrl+ Cdo zatrzymania programu występuje opóźnienie . Czy jest szansa na skrócenie opóźnienia przez kilkakrotne naciśnięcie klawisza Ctrl+ C? A może marnuję naciśnięcia klawiszy?

The Unfun Cat
źródło
Zauważyłem, że podczas uruchamiania procesu, który wywołuje różne procesy potomne, Ctrl-C czasami przerywa działające dziecko, ale nie proces macierzysty. To prawda bash, ale nie w przypadku, w zshktórym zawsze zamyka rodzic. To jeden z powodów, które lubię zsh.
joeytwiddle
17
Tak, podobnie jak kilkakrotne naciśnięcie przycisku windy lub przycisku przejścia poprzecznego spowoduje, że winda wjedzie wcześniej lub kontrolka zmieni kolor na zielony szybciej.
Michael
3
Tak, podobnie jak przyciski windy i przejścia dla pieszych, CTRL-C może się również przylepić lub zardzewieć lub rozwinąć niepewne połączenia. Naciskanie więcej razy jest dobrą taktyką, ponieważ tylko jedno naciśnięcie musi zarejestrować się, aby przyjechać winda, znak przejścia zaświeci się lub program się zamknie.
hippietrail
1
@hippietrail, ale twoja powłoka wydrukuje się, ^Cgdy zarejestruje prasę (przynajmniej bash to zrobi)
wchargin
1
Jeśli chodzi o to, co jest warte, nie uważam, aby marnowało moje naciśnięcia klawiszy - uważam, że powoduje to frustrację w nieszkodliwy sposób. (Zazwyczaj uderzam go 2-3 razy, ale częściowo dlatego, że „dorastałem” na terminalach podłączonych do linii telefonicznych, gdzie nie zawsze można było liczyć na każde naciśnięcie klawisza docierające do maszyny.)
keshlam

Odpowiedzi:

35

Po pierwszym Ctrl-Cprogram odbierze SIGINTi zwykle rozpoczyna czyszczenie (usuwanie plików tmp, zamykanie gniazd itp.). Jeśli trafisz Ctrl-Cznowu podczas gdy się dzieje, to może się zdarzyć, że przerywają czystej rutyny w górę (czyli dodatkowy sygnał może zostać rozpatrzony zamiast pozostania w spokoju), pozostawiając za sobą bałagan. Chociaż zwykle tak nie jest, częściej dodatkowe sygnały są w rzeczywistości wysyłane późniejproces został zakończony (z powodu nieodłącznych opóźnień w interakcji operatora z systemem). Oznacza to, że sygnały są odbierane przez inny proces (często shell, ale nie zawsze). Jeśli ten odbiorca nie obsługuje właściwie tego sygnału (jak zwykle robi to shell - patrz odpowiedź Jenny D), możesz być niemile zaskoczony wynikiem takiej akcji.

John1024
źródło
Dlaczego miałoby to zakłócać procedurę czyszczenia? To tylko kolejny sygnał, INTże proces odbiera.
chaos
4
@chaos Dlaczego warto? Powinien, jeśli rutyna czyszczenia została zawieszona i chcesz ją zatrzymać. Czy to naprawdę działa w ten sposób? Tak, dość często. Możesz to po prostu zademonstrować: utwórz skrypt bash w jednym wierszu trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Uruchom skrypt i naciśnij dwukrotnie Ctrl-C. Zobaczysz, że drugie ctrl-C jest przekazywane do procedury „czyszczenia” (w instrukcji pułapki) i kończy sleeppolecenie.
John1024,
1
@ John1024 Ah, teraz to widzę. Dzięki za fragment skryptu ^^ Ale czyszczenie nie zostało anulowane patrz: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10To tylko sleeppolecenia, które odbierają sygnały. Oboje myliliśmy się xD
chaos
2
To jest niepoprawne Dostarczanie sygnału jest synchroniczne. Jeśli isigjest włączony, jak tylko naciśnięty zostanie klawisz CTRL-C i odebrany przez jądro (w przypadku emulatora terminala, jak tylko emulator terminala zapisze go po stronie master pseudo-terminala), sygnał SIGINT jest wysyłany do wszystkich procesy w grupie procesów pierwszego planu terminala. Może być tam zablokowany, ale nie zostanie później dostarczony do innego procesu. Nawet jeśli bufor urządzenia końcowego jest pełny (aplikacje nie przeczytały żadnej z wpisanych rzeczy), CTRL-C przeskoczy kolejkę.
Stéphane Chazelas
1
Tak, jako przykład, VLC interpretuje wiele sygnałów Ctrl + C jako sposób na wyjście z nieczystości, podczas gdy pojedynczy Ctrl + C będzie próbował zakończyć czysto.
Jeremy Visser
11

Marnujesz je. Wszystko, co się dzieje, to to, że gdy serwer zakończy wyświetlanie ekranu, otrzyma wiele Ctrl-C. Pierwszy zostanie użyty do zabicia procesu, a następne trafią do twojej powłoki, która następnie będzie wyglądać jak

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 
Jenny D.
źródło
6
Proces niekoniecznie kończy się podczas wysyłania SIGINT. Może pozostawać przy życiu przez czas nieokreślony i robić coś innego za każdym naciśnięciem Ctrl + C.
Brian Gordon,
Prawdziwe. Robiłem założenia, w jaki sposób użytkownik czyta plik.
Jenny D
5

Krótka odpowiedź: jeśli proces na to zareaguje.

Długa odpowiedź: po naciśnięciu ctrl+ cjądro wysyła sygnał do procesu. Który sygnał można ustalić za pomocą następującego polecenia:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Zobacz stronę manuala stty:

   intr CHAR
          CHAR will send an interrupt signal

Jest to sygnał INT, znany również jako numer 2. Gdy proces ma moduł obsługi sygnału, może na to zareagować. Większość procesów wykonuje niektóre zadania czyszczenia, aby zakończyć się pomyślnie.

chaos
źródło
Ctrl-Z zwykle wysyła SIGTSTP, które można obsłużyć (w przeciwieństwie do SIGSTOP).
peterph
4
Nie, to nie powłoka wysyła SIGINT do procesu. To kernel(dyscyplina liniowa terminala, sterownik terminala) wysyła SIGINT do każdego procesu w grupie procesów pierwszego planu terminala.
Stéphane Chazelas,
Przyszli czytelnicy, zobacz także unix.stackexchange.com/a/120071/135943 .
Wildcard,
4

Masz rację. Klawisze są marnowane. Gdy naciśniesz Crtl+Ci zostanie wykryty, istnieją zasoby, które należy wyczyścić, dlatego zajmuje to trochę czasu. Jedynym możliwym przypadkiem, w którym wiem, gdzie Ctrl+Cwymagane jest naciśnięcie , jest anulowanie procesu aktualizacji Yum, gdzie Yum wymaga Ctrl+Cdwukrotnego naciśnięcia, aby potwierdzić, że naprawdę chcesz anulować.

Nav
źródło
2

Chociaż tylko jedna Ctrl-Cjest niezbędna w ogólnym przypadku, istnieją sytuacje, w których może to być konieczne. Python na przykład łapie pułapki Ctrl-Cpodczas tworzenia nowego wątku, więc jeśli coś pójdzie nie tak w trakcie uruchamiania wielu wątków, konieczne jest wielokrotne wysyłanie go, aby przejść do pythonprocesu nadrzędnego bez bycia złapany.

Patrick Collins
źródło
1
Zdarza mi się to od czasu do czasu, gdy tworzę wielowątkowe / przetwarzane skrypty python. Czasami potrzeba kilku pras, zanim główny proces zostanie zabity.
Lew
0

I zawsze trzeba nacisnąć Ctrlcczasach wielu. Nigdy wcześniej nie reagowałem na to za pierwszym razem i muszę go używać wiele razy, dopóki system nie zorientuje się, Ctrlcże wysłano wiadomość. Wydaje się, że tak naprawdę większość z nich tęskni / traci.

użytkownik280568
źródło