Qual è la differenza tra Ctrl-z e Ctrl-c nel terminale?


120

Qualcuno può dirmi la differenza tra ctrl+ ze ctrl+ c?

Quando sono nel terminale, entrambe le combinazioni interrompono il processo corrente, ma qual è esattamente la differenza tra entrambi?


Ho fatto una domanda molto simile qui: unix.stackexchange.com/questions/116959/…
ThorSummoner


sì, sono riuscito a capire la differenza tra entrambi !!
chaitanya lakkundi,

Una cosa che voglio aggiungere qui, che la maggior parte dei ragazzi (anche nella mia cerchia professionale) non fa distinzioni tra di loro. E ha usato l'opzione CTRL-Z per terminare il comando. Qual è la pratica sbagliata. È necessario utilizzare CTRL-C in tutte queste istanze. Come CTRL-Z ha semplicemente messo in background. Quindi il processo non è terminato fino al completamento, che potrebbe non essere desiderato dall'utente (la maggior parte delle volte) quando preme CTRL-Z per terminare.
kuldeep.kamboj,

Risposte:


156

Se lasciamo i casi limite da un lato, la differenza è semplice. Control+ Cinterrompe l'applicazione quasi immediatamente mentre Control+ la Zsposta in background, sospesa.

La shell invia segnali diversi alle applicazioni sottostanti su queste combinazioni:

  • Control+ C(carattere di controllo intr) invia SIGINT che interromperà l'applicazione. Di solito causando l'interruzione, ma spetta all'applicazione decidere.

  • Control+ Z(carattere di controllo susp) invia SIGTSTP a un'applicazione in primo piano, posizionandolo efficacemente in background, sospeso. Questo è utile se devi uscire da qualcosa come un editor per andare a prendere alcuni dati di cui hai bisogno. È possibile tornare all'applicazione eseguendo fg(o %xdove si xtrova il numero lavoro come mostrato in jobs).

    Possiamo testarlo eseguendo nano TEST, quindi premendo Control+ Ze quindi eseguendo ps aux | grep TEST. Questo ci mostrerà che il nanoprocesso è ancora in corso:

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

    Inoltre, possiamo vedere (da quella T, che si trova nella colonna dello stato) che il processo è stato interrotto . Quindi è ancora vivo, ma non funziona ... Può essere ripreso.

    Alcune applicazioni si arrestano in modo anomalo se hanno processi esterni in corso (come una richiesta Web) che potrebbero andare in timeout mentre dormono.


51
Vale la pena aggiungere che è anche possibile eseguire bg(anziché fg) per non sospendere un'applicazione che è stata Ctrl + Z'ed senza rimetterla in primo piano; dandoti effettivamente il controllo sia della shell che ha avviato l'applicazione sia dell'applicazione stessa, come se avessi usato &all'avvio dell'applicazione. Questo spesso è utile quando ti sei dimenticato di iniziare con &:)
Malte Skoruppa,

6
E puoi tornare a quel processo digitando di fgnuovo!
slitta,

4
Nel caso in cui vi siano diversi lavori sospesi o in background: "jobs" li elenca e "fg% n" o "bg% n" o addirittura "kill% n" per mettere il lavoro% n in primo piano, in background o ucciderlo .
Olivier Dulac,

3
@Oli: il tuo secondo paragrafo dice: "La shell invia [s] ... segnali alle applicazioni sottostanti ..." No, il sistema operativo / driver del terminale invia i segnali. (In un sistema a finestre, il gestore delle finestre può svolgere un ruolo.) Inoltre, per essere completo (anche se al di là dell'ambito della domanda originale), potresti voler menzionare Ctrl + \.
Scott,

Come fa la sessione a sapere quale gruppo di processi deve tornare in primo piano dopo aver eseguito uno ctrl co entrambi ctrl z? L'impostazione predefinita è SID (bash)?
jiggunjer,

16

Control+ Zsospende un processo ( SIGTSTP) e Control+ Cinterrompe un processo ( SIGINT)

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

Su sistemi simili a Unix, Control + Z è il mapping di tastiera predefinito più comune per la sequenza di tasti che sospende un processo

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

Nei sistemi POSIX, la sequenza fa sì che il programma attivo riceva un segnale SIGINT. Se il programma non specifica come gestire questa condizione, viene chiuso. In genere un programma che gestisce un SIGINT si interromperà comunque, o almeno terminerà l'attività in esecuzione al suo interno


1
Buoni riferimenti per la pubblicazione di lavori. Ma in generale, Wikipedia non è un'ottima fonte di riferimenti tecnici.
Aaron,

3
@ BryceAtNetwork23 che è molto vero; Ho sentito in questo caso che la definizione di Wikipedia era abbastanza decente. Cercherò ulteriori riferimenti tecnici in futuro!
Sonno depresso Bulbasaur

14

Ctrl+ CViene usato per uccidere un processo con il segnale SIGINT, in altre parole è un educato uccidere .

Ctrl+ Z viene utilizzato per sospendere un processo inviandogli il segnale SIGTSTP, che è come un segnale di sospensione , che può essere annullato e il processo può essere ripreso di nuovo.

Tuttavia, quando un processo viene sospeso, possiamo riprenderlo nuovamente da fg(riprendi in primo piano) e bg(riprendi in background), ma non riesco a riprendere un processo interrotto, questa è una differenza tra l'utilizzo di Ctrl+ C& Ctrl+ Z.

Come possiamo visualizzare i processi sospesi?

Il jobscomando fornisce un output in questo modo:

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

Come interrompere un processo sospeso in background?

Usando il killcomando:

kill %ndove nè il numero visualizzato dal jobscomando. Quindi, se voglio uccidere cat: kill %1.


1
in conformità con altri commenti in questo thread, correzione: ctrl-z invia un segnale SIGTSTP non un SIGSTOP.
lukewendling

Kill% 1 mi dice - Operazione non consentita. Perchè così? Grazie
Satya Prakash,

7

Per dirla semplicemente:

  • CTRL-C chiede l' interruzione del programma .

  • CTRL-Z forza il programma a sospendere e andare in secondo piano .

    Ciò ti consente di riprenderlo in seguito con il comando fg. Le attività in background rimanenti vengono interrotte quando si esce dalla shell di accesso.


5

Questo dovrebbe aiutare

Ctrl+ Zviene utilizzato per sospendere un processo inviandogli il segnale SIGSTOP, che non può essere intercettato dal programma. Mentre Ctrl+ Cviene utilizzato per terminare un processo con il segnale SIGINT, e può essere intercettato da un programma in modo che possa ripulirsi da solo prima di uscire o non uscire affatto.


4
Questo non è del tutto corretto. Invia SIGTSTP, che può essere catturato dal programma. Ci sono quattro diversi segnali, che possono sospendere un programma SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. Di quelli solo SIGSTOPnon possono essere bloccati. Gli altri tre vengono utilizzati dal terminale per arrestare il processo in condizioni diverse.
Kasperd,

4

quando premi ctrl+ c, significa che invii SIGINT al tuo processo. come si digita questo comando: kill -SIGINT <your_pid>. Ti ucciderà il tuo processo. Ecco perché non puoi vederlo quando emetti il comando ps .
Quando premi ctrl+ z, significa che invii SIGSTOP al tuo processo. come si digita questo comando: kill -SIGKSTOP <your_pid>. Arresterà il tuo processo, ma il processo è ancora vivo. Quindi puoi riattivare il tuo processo inviando SIGCONT al tuo processo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.