O que há de diferente entre Ctrl + Z e Ctrl + C na linha de comando do Unix?

Respostas:

251

Control+ Zé usado para suspender um processo enviando o sinal SIGSTOP, que não pode ser interceptado pelo programa. Enquanto Control+ Cé usado para interromper um processo com o sinal SIGINT, e pode ser interceptado por um programa para que ele possa se limpar antes de sair ou não sair.

Se você suspender um processo, isso será exibido no shell para informar que foi suspenso:

[1]+  Stopped                 yes

No entanto, se você matar um, não verá nenhuma confirmação além de retornar ao prompt do shell. Quando você suspende um processo, também pode fazer coisas sofisticadas. Por exemplo, executando isso:

fg

Com um programa suspenso, ele o trará de volta ao primeiro plano.

E executando o comando

bg

Com um programa suspenso, ele será executado em segundo plano (a saída do programa continuará no TTY).

Se você deseja matar um programa suspenso, não precisa trazê-lo de volta fgprimeiro, basta executar o comando:

kill %1

Se você tiver vários comandos suspensos, executando

jobs

irá listá-los, assim:

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

Usando %#, onde #é o número do trabalho (aquele em colchetes da jobssaída) com bg, fgou kill, pode ser usado para fazer a ação em que trabalho.

Wuffers
fonte
3
Você pode alterar quais chaves executam qual trabalho usando o sttycomando Por exemplo stty susp ^Z ou stty intr ^C.
RedGrittyBrick
7
Na verdade, ele envia SIGTSTP, que pode ser interceptado.
Simon Richter
2
Legal! Então, se um programa está se recusando a morrer com Ctrl + C, como você o força a matá-lo?
Aditya MP
2
@adityamenon Encontre o nome do executável, por exemplo, amaroke execute killall amarok, ou execute ps auxe localize a identificação do processo ao lado do nome do executável e execute kill {process id}.
de Bruno Dedo
22

Ctrl + Z suspende o processo com SIGTSTP, você pode retomar mais tarde. Ctrl + C mata o processo com SIGINT, que finaliza o processo, a menos que seja tratado / ignorado pelo destino, para que você não possa retomar. Há também um SIGSTOP que pode ser enviado kill()e que o processo não pode interceptar. SIGCONT é a contraparte do SIGSTOP e do SIGTSTP que suspende o processo.

Ben Voigt
fonte
Não, isso é SIGTSTP, não SIGSTOP e pode ser interceptado.
sch 01/10
@ sch, isso está correto agora?
Ben Voigt
Sim, embora Ctrl-Z (e CTRL-C) faça com que um grupo de processos (o grupo de processos em primeiro plano do terminal) receba esse sinal, não necessariamente apenas um processo. Observe também que SIGTTIN e SIGTTOU foram enviados para processos que não estão no grupo de processos em primeiro plano do terminal ao tentar ler ou gravar de / para ele, que também os suspendem.
sch 01/10
@ sch: O processo vs grupo não é apenas uma diferença na forma como o sinal é enviado? O IIRC kill()permite enviar SIGSTOPpara um grupo muito bem.
Ben Voigt
Sim, meu comando era sobre o seu CTRL-Z suspende o processo ... o que pode induzir as pessoas a pensarem que ele é enviado para apenas um processo quando na verdade é um trabalho ou grupo de processos .
SCH
17

CTRL + Z interrompe (pausa) um trabalho

CTRL + C finaliza um trabalho

com CTRL + C, você não pode retomar o processo, mas com CTRL + Z o trabalho pode ser retomado apenas digitando no prompt de comando:

fg %1

se você tiver vários processos em pausa, faça

jobs

para ver a saída e selecione o número apropriado para retomar, por exemplo

fg %3

retoma o terceiro trabalho na lista. Você também pode ter trabalhos em execução em segundo plano com

bg %n

onde n é o número do trabalho.

g24l
fonte
São trabalhos (grupos de processos), não processos com os quais CTRL-C, CTRL-Z, fg e bg lidam.
sch 01/10
3
Cntrl + Z pause the currently running process. 

E

Cntrl + C simply terminates the running process.

Usando Cntrl + C, você não pode retomar o processo. onde, como usar Cntrl + Z, você pode retomar o processo.

use fg% 1 para retomar o processo.

Ravindra Miyani
fonte
3

CTRL+ Zinterrompe (pausa) um trabalho

CTRL+ Ctermina um trabalho

Com CTRL+ Cvocê não pode retomar o processo, mas com CTRL+ Zo trabalho pode ser retomado apenas digitando no prompt de comando:

fg% 1

Se você tiver vários processos em pausa, deverá fazer

empregos

para ver a saída.

abul
fonte
2

As respostas anteriores estão corretas, mas por alguma razão desconhecida, o Ctrl-Z suspende todos os processos filhos também, mas o killall -SIGSTOP ... suspende apenas o processo mais à frente (pai) e deixa os filhos para executar como quiserem.

Kostas
fonte