Terminal działa, gdy go otwieramy.
luvpreet@DHARI-Inspiron-3542:/$
Właśnie to otworzyłem. Kiedy naciskam Ctrl+ C, dlaczego nie zabija się i nie zamyka terminala?
command-line
luv.preet
źródło
źródło
Odpowiedzi:
Ctrl+ Cto sygnał przerwania. Kiedy wpiszesz to w terminalu, bash wysyła SIGINT do zadania na pierwszym planie. Jeśli nie ma pracy (co dzieje się po otwarciu terminala), nic się nie dzieje. Program emulatora terminali nie działa w powłoce, więc nie odbiera sygnału i nie zamyka się.
Jeśli chcesz zamknąć terminal za pomocą klawisza sterującego, użyj Ctrl+ D(EOF), co powoduje wyjście bash'a (i również zamyka terminal).
Zobacz także: Przewodnik Bash dla początkujących na temat sygnałów i bardziej szczegółowo Jak działa obsługa sygnałów
Uwaga: Ta odpowiedź została edytowana od czasu opublikowania komentarzy
źródło
bash
że zakończy działanie jakiegokolwiek programu po naciśnięciu ctrl-c. Po prostu poinformuje jądro, która grupa procesów jest aktywna, a jądro wygeneruje sygnał do tej grupy procesów, gdy otrzyma ctrl-c z programu terminalowego.Klawisz ^C, podobnie jak inne klawisze *, nie jest magiczny - wysyła kod do dowolnego programu. (W X kod klucza to 54 dla Cmodyfikatora 0x4 dla Ctrl.) Program, który odbiera strumień kluczy, jest odpowiedzialny za zrobienie z nimi czegoś odpowiedniego - pamiętaj, że w wielu aplikacjach GUI naciśnięcie klawisza jest kopiowane do schowka.
Gdy emulator terminala GUI (np. Konsole) lub terminal wirtualny otrzyma naciśnięcie klawisza, które interpretuje ^C, może wykonać jedną z trzech czynności. Jeśli terminal jest w trybie surowym , wówczas uruchomiony program poprosił go, aby nie wykonywał żadnej obsługi samych kluczy specjalnych i przekazał je bezpośrednio do programu. Niektóre programy obsługujące zaawansowane funkcje, takie jak edycja linii, są wprowadzane za pomocą klawiatury w pewnej konfiguracji pomiędzy pełnymi surowymi naciśnięciami klawiszy a przetworzonymi wierszami tekstu;
bash
, na przykład, odbiera naciśnięcia klawiszy pojedynczo. ^Cjest interpretowany przez terminal, ale klawisz Backspace jest wysyłany do powłoki w niezmienionej postaci.Większość programów korzysta jednak z trybu gotowego (ponieważ nie jest on surowy), w którym terminal interpretuje niektóre podstawowe naciśnięcia klawiszy przed faktycznym wysłaniem ich do programu (dlatego można użyć backspace w
cat
). W tym trybie sam terminal przekształca ^Cnaciśnięcie klawisza naSIGINT
sygnał i wysyła go do procesu potomnego. Ponieważ terminal wygenerował sygnał, nie pomyli się i nie zakończy połączenia.źródło
Ctrl
+Alt
+Delete
w świecie Windows, w którym kombinacja klawiszy jest dość zbliżona do magii (można go użyć do uruchomienia systemu Windows, to samo w sobie jest dość magiczne!), Ponieważ jest zakodowane w systemie, aby przerwać i zastępują prawie wszystko - całkiem podobneSysRq
w tym sensie.cbreak
/-icanon
, Ale pozostawiaisig
ustawiony tryb i odbiera rzeczywiste sygnały po naciśnięciu mapowanych do nich klawiszy. Obsługuje toSIGINT
, zachowując się tak, jak opisano (nie tylko anuluje edycję linii, ale także anuluje wszelkie wewnętrzne polecenia, które mogą być uruchomione w pętli) i całkowicie ignorujeSIGTSTP
iSIGQUIT
. Inne programy, takie jak vi, mogą nie.Ctrl
+Alt
+Delete
był jeszcze bardziej magiczny niż obecnie - blogs.msdn.microsoft.com/oldnewthing/20140912-00/?p=44083 . Chociaż w głębi serca jestem osobą związaną z Linuksem, często jestem pod dużym wrażeniem stopnia, w jakim system Windows sprawił, że na początku jego działania były przyjazne dla użytkownika i logiczne przy tak ograniczonych zasobach.^c
, nie zabije menedżera okien :). Nie jestem w stanie wypowiedzieć się na temat postaci surowej / gotowanej na raz, ale odpowiedź jest na temat tego, jak generuje to naciśnięcie klawiszaSIGINT
^Cjest zwykle mapowany (patrz
stty -a
) naSIGINT
sygnał (patrzman 7 signal
).Nieprzechwycony
SIGINT
przerywa trwający proces, ALE ...SIGINT
jest jednym z sygnałów, dla których proces może określić zachowanie („Złapanie sygnału”).To, co nazywacie „terminalem”, łapie
SIGINT
i wraca do pracy.źródło
Kiedy byłem początkujący, brakowało mi części, że kiedy korzystałem z wiersza poleceń, faktycznie używałem dwóch oddzielnych programów, terminala i powłoki (np. Bash)
Powłoka jest tym, co już pewnie wiesz, programem, który przyjmuje polecenia wejściowe lub skrypty, wykonuje je i wypisuje swoje dane wyjściowe.
Terminal po drugiej stronie jest jak człowiek pośrodku między użytkownikiem a programem (który to program jest zwykle powłoką jak bash lub fish). Terminal odczytuje dane wejściowe na przykład z klawiatury, być może przetworzy je w jakiś sposób i przekieruje do innego programu (bash).
Działa to również w drugą stronę, gdy inny program wypisuje coś, że coś jest przekierowywane do terminala, wówczas zadaniem terminalu jest wyprowadzenie tego czegoś na ekran. Pomiędzy pobraniem danych wejściowych a wydrukowaniem ich na ekranie terminal może interpretować dane wejściowe na różne sposoby.
Na przykład, jeśli program wyświetla następującą sekwencję:
Terminal wyświetli na ekranie „dodatkowy tekst foobar” z czerwonymi literami. Wynika to z faktu, że terminal wybiera specjalny sposób traktowania tego dziwnego kodu, który podpowiada mu, aby wydrukował następujący wynik na czerwono.
Podobnie, gdy użytkownik naciska
Ctrl - C
, jedyną specjalną rzeczą w tym jest to, że terminal decyduje się traktować go w specjalny sposób, nie ma nic specjalnego w tej sekwencji klawiszy. W szczególności sugeruje to wysłanie sygnału przerwania (SIGINT) do procesu działającego wewnątrz terminala, czyli powłoki. Jeśli w tym momencie istnieje jakikolwiek program, który został odrodzony przez powłokę i aktualnie działa na pierwszym planie, również odbiera sygnał. Teraz powłoka ma specjalny moduł obsługi tego sygnału i nic się nie dzieje. Ale większość programów ma domyślne programy obsługi, które w przypadku SIGINT po prostu wychodzą.źródło
Każdy sygnał ma przypisaną domyślną akcję. Domyślną akcją dla sygnału jest akcja wykonywana przez skrypt lub program po otrzymaniu sygnału.
Ctrl+ Cwysyła sygnał „przerwania” ( SIGINT ), który domyślnie kończy działanie na zadaniu uruchomionym na pierwszym planie.
Ctrl+ Dmówi terminalowi, że powinien zarejestrować EOF na standardowym wejściu, co bash interpretuje jako chęć wyjścia .
Proces może zignorować sygnał INT, a Bash robi to, gdy działa w trybie interaktywnym.
Z instrukcji :
Zrozum to za pomocą pułapki :
trap to funkcja wbudowana w powłokę, która reaguje na sygnały sprzętowe i inne zdarzenia. Definiuje i aktywuje procedury obsługi, które mają być uruchamiane, gdy powłoka odbiera sygnały lub inne specjalne warunki.
Jeśli sigspec ma wartość 0 lub EXIT , arg jest wykonywane po wyjściu powłoki. Aby to zrozumieć, zamknij terminal i otwórz go po edycji kolejnej linii w
.bashrc
pliku.Ctrl D jest podobny do
exit
polecenia, aby wyjść z terminala.Jeśli chcesz, aby Bash zakończył działanie po otrzymaniu sygnału INT, nawet w trybie interaktywnym, możesz dodać następujące elementy do
~/.bashrc
:lub
źródło