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


Estou usando o Mac OS X Terminal. E eu uso Ctrl+Z ou Ctrl+C para parar alguns programas. Mas percebi que não sei exatamente o que eles estão fazendo. Quais são eles e qual a diferença entre eles?

Esta questão foi uma Pergunta de super usuário da semana.
  Leia o 13 de março de 2011 entrada de blog para mais detalhes ou envie seu próprio Pergunta da semana.


177


origem




Respostas:


Ao controle+Z é usado para suspender um processo enviando o sinal SIGSTOP, que não pode ser interceptado pelo programa. Enquanto Ao controle+C é usado para matar um processo com o sinal SIGINTe pode ser interceptado por um programa para que ele possa se auto-limpar antes de sair ou não sair.

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

[1]+  Stopped                 yes

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

fg

Com um programa suspenso, ele será levado de volta ao primeiro plano.

E executando o comando

bg

Com um programa suspenso permitirá que ele seja executado em segundo plano (a saída do programa ainda irá para o TTY, no entanto).

Se você quer matar um programa suspenso, você não precisa trazê-lo de volta fg Primeiro, você pode simplesmente fazer 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 entre colchetes do jobs saída) com bg, fgou kill, pode ser usado para executar a ação nesse trabalho.


234



Você pode alterar quais teclas fazem qual trabalho usando o stty comando. Por exemplo stty susp ^Z  ou stty intr ^C. - RedGrittyBrick
Na verdade, ele envia SIGTSTP, que pode ser interceptado. - Simon Richter
Legal! Então, se um programa está se recusando a morrer com Ctrl + C, como você o mata? - Aditya M P
@adityamenon Encontre o nome do executável, por exemplo amarok e corra killall amarokou execute ps aux e encontre o id do processo ao lado do nome do executável e execute kill {process id}. - Bruno Finger


Ctrl + Z suspende o processo com SIGTSTP, você pode resumir mais tarde. Ctrl + C mata o processo com SIGINT, que termina o processo, a menos que seja manipulado / ignorado pelo alvo, então você não pode retomar o processo. Há também um SIGSTOP que pode ser enviado por kill() e qual o processo não pode interceptar. O SIGCONT é a contraparte do SIGSTOP e do SIGTSTP que suspende o processo.


22



Não, isso é SIGTSTP, não é SIGSTOP e pode ser interceptado. - sch
@sch, está correto agora? - Ben Voigt
Sim, embora Ctrl-Z (e CTRL-C) cause um processo grupo (o grupo de processos em primeiro plano do terminal) para receber esse sinal, não necessariamente apenas um processo. Observe também que SIGTTIN e SIGTTOU são enviados para processos que não estão no grupo de processos em primeiro plano do terminal quando tentam ler ou gravar de / para ele, que também os suspende. - sch
@sch: O processo vs não é apenas uma diferença na forma como o sinal é enviado? IIRC kill() deixa você enviar SIGSTOP para 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 pensar que é enviado para apenas um processo quando é realmente um trabalho ou grupo de processos. - sch


CTRL + Z para (pausa) um trabalho

CTRL + C termina um trabalho

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

fg %1

se você tem vários processos em pausa, então você deve fazer

jobs

para ver a saída e selecionar o número apropriado para retomar, e.

fg %3

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

bg %n

onde n é o número do trabalho.


17



São jobs (grupos de processos), não processos com os quais CTRL-C, CTRL-Z, fg e bg lidam. - sch


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 usando Ctrl + Z você pode retomar o processo.

use fg% 1 para retomar o processo.


3





CTRL+Z pára (pausa) um trabalho

CTRL+Ctermina 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ê tem vários processos em pausa, então você deve fazer

empregos

para ver a saída.


3





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


2