Cosa c'è di diverso tra Ctrl + Z e Ctrl + C nella riga di comando di Unix?


189

Sto usando il terminale Mac OS X. E uso Ctrl+ Zo Ctrl+ Cper interrompere alcuni programmi. Ma mi sono reso conto che non so cosa stiano facendo esattamente. Quali sono e qual è la differenza tra loro?

Questa domanda era una domanda super utente della settimana .
Leggi il post del blog del 13 marzo 2011 per maggiori dettagli o invia la tua domanda della settimana.

Risposte:


251

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

Se sospendi un processo, questo verrà visualizzato nella shell per dirti che è stato sospeso:

[1]+  Stopped                 yes

Tuttavia, se ne uccidi uno, non vedrai alcuna conferma se non il ritorno a un prompt della shell. Quando sospendi un processo, puoi fare anche cose fantasiose. Ad esempio, eseguendo questo:

fg

Con un programma sospeso lo riporterà in primo piano.

Ed eseguendo il comando

bg

Con un programma sospeso gli consentirà di essere eseguito in background (l'output del programma andrà comunque al TTY).

Se vuoi uccidere un programma sospeso, non devi prima riportarlo indietro fg, puoi semplicemente eseguire il comando:

kill %1

Se hai più comandi sospesi, in esecuzione

jobs

li elencherò in questo modo:

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

Utilizzando %#, dove #è il numero di lavoro (quello tra parentesi quadre dal jobsdell'uscita) bg, fgoppure kill, può essere utilizzato per fare l'azione su quel lavoro.


3
È possibile modificare quali chiavi eseguono il lavoro utilizzando il sttycomando. Ad esempio stty susp ^Z o stty intr ^C.
RedGrittyBrick

7
In realtà, invia SIGTSTP, che può essere intercettato.
Simon Richter,

2
Freddo! Quindi se un programma si rifiuta di morire con Ctrl + C, come si fa a forzarlo ad ucciderlo?
Aditya MP,

2
@adityamenon Trova il nome dell'eseguibile, ad esempio amaroked esegui killall amarokoppure esegui ps auxe trova l'ID processo accanto al nome dell'eseguibile ed esegui kill {process id}.
Bruno Finger

22

Ctrl + Z sospende il processo con SIGTSTP, puoi riprenderlo in seguito. Ctrl + C uccide il processo con SIGINT, che termina il processo a meno che non sia gestito / ignorato dalla destinazione, quindi non è possibile riprenderlo. C'è anche un SIGSTOP che può essere inviato kill()e che il processo non può intercettare. SIGCONT è la controparte di SIGSTOP e SIGTSTP che interrompe il processo.


No, questo è SIGTSTP, non SIGSTOP e può essere intercettato.
sch

@sch, è corretto adesso?
Ben Voigt,

Sì, anche se Ctrl-Z (e CTRL-C) fa sì che un gruppo di processi (il gruppo di processi in primo piano del terminale) riceva quel segnale, non necessariamente solo un processo. Si noti inoltre che SIGTTIN e SIGTTOU vengono inviati ai processi non nel gruppo di processi in primo piano del terminale quando si tenta di leggere o scrivere da / su di esso, che li sospendono.
sch

@sch: Il processo vs gruppo non è solo una differenza nel modo in cui viene inviato il segnale? IIRC kill()ti consente di inviare SIGSTOPa un gruppo bene.
Ben Voigt,

Sì, il mio comando riguardava il fatto che CTRL-Z sospendesse il processo ... il che potrebbe indurre in errore le persone a pensare che venga inviato a un solo processo quando in realtà è un lavoro o un gruppo di processi .
sch

17

CTRL + Z interrompe (mette in pausa) un lavoro

CTRL + C termina un lavoro

con CTRL + C non è possibile riprendere il processo ma con CTRL + Z il lavoro può essere ripreso semplicemente inserendo il prompt dei comandi:

fg %1

se hai più processi in pausa, allora dovresti farlo

jobs

per vedere l'output e selezionare il numero appropriato per riprendere ad es

fg %3

riprende il terzo lavoro nell'elenco. Puoi anche avere lavori in esecuzione in background con

bg %n

dove n è il numero del lavoro.


Si tratta di lavori (gruppi di processi), non di processi che CTRL-C, CTRL-Z, fg e bg gestiscono.
sch

3
Cntrl + Z pause the currently running process. 

E

Cntrl + C simply terminates the running process.

Utilizzando Cntrl + C non è possibile riprendere il processo. dove come usando Cntrl + Z puoi riprendere il processo.

usa fg% 1 per riprendere il processo.


3

CTRL+ Zinterrompe (mette in pausa) un lavoro

CTRL+ Ctermina un lavoro

Con CTRL+ Cnon è possibile riprendere il processo, ma con CTRL+ Zil lavoro può essere ripreso semplicemente inserendo il prompt dei comandi:

fg% 1

Se hai più processi in pausa, allora dovresti farlo

lavori

per vedere l'output.


2

Le risposte precedenti sono corrette, ma per qualche ragione sconosciuta Ctrl-Z sospende anche tutti i processi figlio, ma killall -SIGSTOP ... sospende solo il processo più vicino (genitore) e lascia i bambini correre come vogliono.

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.