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?
41
bash
, ale nie w przypadku, wzsh
którym zawsze zamyka rodzic. To jeden z powodów, które lubięzsh
.^C
gdy zarejestruje prasę (przynajmniej bash to zrobi)Odpowiedzi:
Po pierwszym Ctrl-Cprogram odbierze
SIGINT
i 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.źródło
INT
że proces odbiera.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ńczysleep
polecenie.trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
To tylkosleep
polecenia, które odbierają sygnały. Oboje myliliśmy się xDisig
jest 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ę.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
źródło
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:
Zobacz stronę manuala
stty
: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.źródło
kernel
(dyscyplina liniowa terminala, sterownik terminala) wysyła SIGINT do każdego procesu w grupie procesów pierwszego planu terminala.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ć.
źródło
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
python
procesu nadrzędnego bez bycia złapany.źródło
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.
źródło