Jaka jest różnica między Ctrl-z i Ctrl-c w terminalu?

120

Czy ktoś może mi powiedzieć różnicę między ctrl+ za ctrl+ c?

Kiedy jestem w terminalu, obie kombinacje zatrzymują bieżący proces, ale jaka dokładnie jest różnica między nimi?

chaitanya lakkundi
źródło
Zadałem tutaj bardzo podobne pytanie: unix.stackexchange.com/questions/116959/…
ThorSummoner,
tak, udało mi się zrozumieć różnicę między nimi !!
chaitanya lakkundi
Jedną rzecz, którą chcę tutaj dodać, że większość facetów (również w moim środowisku zawodowym) nie rozróżnia między nimi. I użył opcji CTRL-Z, aby zakończyć polecenie. Co jest złą praktyką. Musisz użyć CTRL-C we wszystkich tych instancjach. Jak CTRL-Z po prostu umieść w tle. Tak więc proces nie zostanie zakończony, dopóki nie zostanie zakończony, co może nie być pożądane przez użytkownika (przez większość czasu), gdy naciska on CTRL-Z, aby zakończyć.
kuldeep.kamboj

Odpowiedzi:

155

Jeśli zostawimy skrzynie z boku z boku, różnica jest prosta. Control+ Cprzerywa aplikację niemal natychmiast, podczas gdy Control+ Zprzetacza ją w tło, zawieszając.

Powłoka wysyła różne sygnały do ​​podstawowych aplikacji w tych kombinacjach:

  • Control+ C(znak kontrolny intr) wysyła SIGINT, który przerywa aplikację. Zwykle powoduje przerwanie, ale decyzja należy do aplikacji.

  • Control+ Z(znak kontrolny susp) wysyła SIGTSTP do aplikacji na pierwszym planie, skutecznie umieszczając go w tle, zawieszając. Jest to przydatne, jeśli chcesz wydostać się z edytora, aby pobrać potrzebne dane. Możesz wrócić do aplikacji, uruchamiając fg(lub %xgdzie xjest numer zadania, jak pokazano na jobs).

    Możemy to przetestować, uruchamiając nano TEST, a następnie naciskając Control+, Za następnie uruchamiając ps aux | grep TEST. To pokaże nam, że nanoproces jest nadal uruchomiony:

    oli     3278  0.0  0.0  14492  3160 pts/4    T    13:59   0:00 nano TEST
    

    Ponadto możemy zobaczyć (z tej litery T, która znajduje się w kolumnie statusu), że proces został zatrzymany . Więc wciąż żyje, ale nie działa ... Można go wznowić.

    Niektóre aplikacje ulegną awarii, jeśli będą miały trwające procesy zewnętrzne (takie jak żądanie sieciowe), które mogą przekroczyć limit czasu podczas snu.

Oli
źródło
51
Warto dodać, że można również uruchomić bg(zamiast fg), aby cofnąć zawieszenie aplikacji, która była Ctrl + Z'ed bez umieszczania jej z powrotem na pierwszym planie; skutecznie dając ci kontrolę zarówno nad powłoką, która uruchomiła aplikację, jak i samą aplikacją, tak jakbyś używał jej &podczas uruchamiania aplikacji. Często przydaje się, gdy zapomniałeś zacząć od &:)
Malte Skoruppa
6
Możesz wrócić do tego procesu, pisząc fgponownie!
sleblanc
4
W przypadku, gdy istnieje kilka zadań zawieszonych lub w tle: „zadania” wypisz je, a „fg% n” lub „bg% n” lub nawet „zabij% n”, aby umieścić zadanie% n na pierwszym planie, w tle lub zabić je .
Olivier Dulac
3
@Oli: W drugim akapicie napisano: „Powłoka wysyła […] sygnały do ​​bazowych aplikacji…”. Nie, system operacyjny / sterownik terminala wysyła sygnały. (W systemie okien menedżer okien może odgrywać rolę.) Ponadto, aby być kompletnym (chociaż poza zakresem oryginalnego pytania), możesz chcieć wspomnieć o Ctrl + \.
Scott,
Jak sesja wiedzieć, który proces grupa musi powrócić na pierwszy plan po wykonując jedną ctrl club ctrl z? Domyślnie jest to SID (bash)?
jiggunjer
16

Control+ Zzawiesza proces ( SIGTSTP) i Control+ Cprzerywa proces ( SIGINT)

http://en.wikipedia.org/wiki/Control-Z

W systemach uniksowych, Control + Z jest najczęstszym domyślnym mapowaniem klawiatury dla sekwencji klawiszy, która wstrzymuje proces

http://en.wikipedia.org/wiki/Control-C

W systemach POSIX sekwencja powoduje, że aktywny program odbiera sygnał SIGINT. Jeśli program nie określi sposobu obsługi tego warunku, zostanie zakończony. Zazwyczaj program, który obsługuje SIGINT, sam się zakończy lub przynajmniej zakończy zadanie w nim działające

Bulbasaur pozbawiony snu
źródło
1
Dobre referencje dotyczące ofert pracy. Ale ogólnie rzecz biorąc, Wikipedia nie jest bardzo dobrym źródłem technicznych odniesień.
Aaron
3
@ BryceAtNetwork23, co jest bardzo prawdziwe; W tym przypadku czułem, że definicja Wikipedii była wystarczająca. W przyszłości będę szukać innych referencji technicznych!
Sleep Deprived Bulbasaur
13

Ctrl+ Csłuży do zabicia procesu sygnałem SIGINT, innymi słowy jest to grzeczne zabicie .

Ctrl+ Z służy do zawieszenia procesu poprzez wysłanie sygnału SIGTSTP, który jest jak sygnał uśpienia, który można cofnąć i proces można wznowić ponownie.

Jednak gdy proces jest zawieszony, możemy go wznowić przez fg(wznowienie na pierwszym planie) i bg(wznowienie w tle), ale nie mogę wznowić zabitego procesu, to jest różnica między używaniem Ctrl+ Ci Ctrl+ Z.

Jak możemy zobaczyć zawieszone procesy?

jobsKomenda daje wyjście tak:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

Jak zabić zawieszony proces w tle?

Za pomocą killpolecenia:

kill %ngdzie njest liczbą wyświetlaną przez jobspolecenie. Więc jeśli chcesz zabić kota: kill %1.

nux
źródło
1
zgodnie z innymi komentarzami w tym wątku, poprawka: ctrl-z wysyła sygnał SIGTSTP, a nie SIGSTOP.
letni
Kill% 1 mówi mi - Operacja niedozwolona. Dlaczego tak? Dzięki
Satya Prakash
7

Mówiąc prosto:

  • CTRL-C żąda przerwania programu .

  • CTRL-Z zmusza program do zawieszenia i przejścia w tło .

    Umożliwia to wznowienie go później za pomocą polecenia fg. Pozostałe zadania w tle są zabijane po wyjściu z powłoki logowania.

thomasrutter
źródło
5

To powinno pomóc

Ctrl+ Zsłuży do zawieszenia procesu poprzez wysłanie mu sygnału SIGSTOP, którego program nie może przechwycić. Podczas gdy Ctrl+ Cjest używany do zabicia procesu z sygnałem SIGINT, i może zostać przechwycony przez program, aby mógł wyczyścić się przed wyjściem lub w ogóle nie wyjść.

Graham
źródło
4
To nie jest do końca poprawne. Wysyła SIGTSTP, co może zostać złapane przez program. Istnieją cztery różne sygnały, które mogą zawiesić program SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. Tylko tych SIGSTOPnie można zablokować. Pozostałe trzy są używane przez terminal do zatrzymania procesu w różnych warunkach.
kasperd
4

kiedy naciśniesz ctrl+ c, oznacza to, że wysyłasz SIGINT do swojego procesu. jak wpisać komendę: kill -SIGINT <your_pid>. Zabije cię twój proces. Dlatego nie możesz tego zobaczyć po wydaniu polecenia ps .
Kiedy naciśniesz ctrl+ z, oznacza to, że wysyłasz SIGSTOP do swojego procesu. jak wpisać komendę: kill -SIGKSTOP <your_pid>. Zatrzyma twój proces, ale proces wciąż żyje. Abyś mógł ponownie aktywować proces, wysyłając SIGCONT do swojego procesu.

ZATRUĆ
źródło