Czym różnią się Ctrl + Z i Ctrl + C w wierszu poleceń systemu Unix?

187

Używam terminala Mac OS X. I używam Ctrl+ Zlub Ctrl+, Caby zatrzymać niektóre programy. Ale zdałem sobie sprawę, że nie wiem, co dokładnie robią. Czym oni są i jaka jest między nimi różnica?

To pytanie było pytaniem superużytkownika tygodnia .
Przeczytaj wpis na blogu z 13 marca 2011 r., Aby uzyskać więcej informacji, lub prześlij własne pytanie tygodnia.

Eonil
źródło

Odpowiedzi:

249

Control+ Zsłuży do zawieszenia procesu poprzez wysłanie sygnału SIGSTOP, którego program nie może przechwycić. Podczas gdy Control+ Csłuży do zabicia procesu za pomocą sygnału SIGINTi może zostać przechwycony przez program, aby mógł wyczyścić się przed wyjściem lub w ogóle nie wyjść.

Jeśli zawiesisz proces, pojawi się on w powłoce, informując, że został zawieszony:

[1]+  Stopped                 yes

Jeśli jednak zabijesz jednego z nich, nie zobaczysz żadnego potwierdzenia oprócz powrotu do powłoki. Gdy zawieszasz proces, możesz też robić z nim wymyślne rzeczy. Na przykład uruchomienie tego:

fg

Po zawieszeniu programu przywróci go na pierwszy plan.

I uruchomienie polecenia

bg

Z zawieszonym programem pozwoli na uruchomienie go w tle (jednak program nadal będzie przechodził do TTY).

Jeśli chcesz zabić zawieszony program, nie musisz go fgnajpierw przywracać , możesz po prostu wykonać polecenie:

kill %1

Jeśli masz wiele zawieszonych poleceń, uruchomione

jobs

wyświetli je w następujący sposób:

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes

Korzystanie %#, gdzie #to liczba miejsc pracy (jeden w nawiasach kwadratowych od jobswyjścia) z bg, fglub killmogą być wykorzystywane do wykonania czynności na tej pracy.

Wuffers
źródło
3
Możesz zmienić, które klawisze wykonują które zadanie, używając sttypolecenia. Na przykład stty susp ^Z lub stty intr ^C.
RedGrittyBrick
7
W rzeczywistości wysyła SIGTSTP, który może zostać przechwycony.
Simon Richter
2
Chłodny! Więc jeśli program nie chce umrzeć za pomocą Ctrl + C, jak zmusić go do zabicia?
Aditya, poseł
2
@adityamenon Znajdź nazwę pliku wykonywalnego, na przykład amaroki uruchom killall amarok, lub uruchom ps auxi znajdź identyfikator procesu obok nazwy pliku wykonywalnego i uruchom kill {process id}.
Bruno Finger,
22

Ctrl + Z zawiesza proces za pomocą SIGTSTP, możesz go wznowić później. Ctrl + C zabija proces za pomocą SIGINT, który kończy proces, chyba że jest on obsługiwany / ignorowany przez cel, więc nie można go wznowić. Istnieje również SIGSTOP, który może zostać wysłany kill()i którego proces nie może przechwycić. SIGCONT jest odpowiednikiem zarówno SIGSTOP, jak i SIGTSTP, który anuluje proces.

Ben Voigt
źródło
Nie, to SIGTSTP, nie SIGSTOP i można go przechwycić.
sch
@sch, czy to teraz poprawne?
Ben Voigt
Tak, chociaż Ctrl-Z (i CTRL-C) powoduje, że grupa procesów (grupa procesów pierwszego planu terminala) odbiera ten sygnał, niekoniecznie tylko jeden proces. Zauważ też, że SIGTTIN i SIGTTOU wysyłane są do procesów spoza pierwszej grupy procesów terminala, gdy następnie próbują czytać lub pisać z / do niego, które również je zawieszają.
sch
@sch: Czy proces vs grupa nie jest tylko różnicą w sposobie wysyłania sygnału? IIRC kill()pozwala dobrze wysłać SIGSTOPdo grupy.
Ben Voigt
Tak, moje polecenie dotyczyło twojego CTRL-Z zawiesza proces ... co może wprowadzać ludzi w błąd, myśląc, że jest wysyłany do jednego procesu, gdy jest to w rzeczywistości zadanie lub grupa procesów .
sch
17

CTRL + Z zatrzymuje (wstrzymuje) zadanie

CTRL + C kończy zadanie

za pomocą CTRL + C nie można wznowić procesu, ale za pomocą CTRL + Z zadanie można wznowić po prostu wpisując komendę promt:

fg %1

jeśli masz wiele procesów wstrzymanych, powinieneś to zrobić

jobs

aby zobaczyć wynik i wybrać odpowiedni numer do wznowienia, np

fg %3

wznawia trzecie zadanie na liście. Możesz także uruchamiać zadania w tle za pomocą

bg %n

gdzie n jest numerem zadania.

g24l
źródło
To zadania (grupy procesów), a nie procesy, którymi zajmują się CTRL-C, CTRL-Z, fg i bg.
sch
3
Cntrl + Z pause the currently running process. 

I

Cntrl + C simply terminates the running process.

Za pomocą Cntrl + C nie można wznowić procesu. gdzie używając Cntrl + Z możesz wznowić proces.

użyj fg% 1, aby wznowić proces.

Ravindra Miyani
źródło
3

CTRL+ Zzatrzymuje (zatrzymuje) zadanie

CTRL+ Ckończy zadanie

Za pomocą CTRL+ Cnie można wznowić procesu, ale za pomocą CTRL+ Zzadanie można wznowić po prostu wpisując w wierszu polecenia:

fg% 1

Jeśli wstrzymałeś wiele procesów, powinieneś to zrobić

Oferty pracy

aby zobaczyć wynik.

abul
źródło
2

Poprzednie odpowiedzi są poprawne, ale z jakiegoś nieznanego powodu Ctrl-Z zawiesza również wszystkie procesy potomne, ale killall -SIGSTOP ... zawiesza tylko proces z przodu (nadrzędny) i pozostawia dzieci do uruchomienia, jak im się podoba.

Kostas
źródło