2011-03-27 00:39:57 +0000 2011-03-27 00:39:57 +0000
191
191

O que é diferente entre Ctrl+Z e Ctrl+C na linha de comando Unix?

Estou a utilizar o Terminal Mac OS X. E eu uso Ctrl+Z ou Ctrl+C para parar alguns programas. Mas percebi que não sei exactamente o que eles estão a fazer. O que são e qual é a diferença entre eles?

Esta pergunta era uma * Pergunta da Semana para Super Utilizadores . Leia a 13 de Março de 2011 * entrada no blog para mais detalhes ou * submeta a sua ** Pergunta da Semana.

Respostas (6)

255
255
255
2011-03-27 01:15:51 +0000

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

Se suspender um processo, este irá aparecer na shell para lhe dizer que foi suspenso:

[1]+ Stopped yes

No entanto, se matar um, não verá outra confirmação a não ser ser ser que seja devolvido a uma shell prompt. Quando se suspende um processo, também se pode fazer coisas extravagantes com ele. Por exemplo, correr isto:

fg

Com um programa suspenso irá trazê-lo de volta para o primeiro plano.

E correr o comando

bg

Com um programa suspenso irá permitir-lhe correr em segundo plano (a saída do programa irá ainda para o TTY, no entanto).

Se quiser matar um programa suspenso, não precisa de o trazer de volta com o fg primeiro, pode simplesmente fazer o comando:

kill %1

Se tiver múltiplos comandos suspensos, correndo

jobs

irá listá-los, desta forma:

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

Usando %#, onde # é o número do trabalho (aquele entre parênteses rectos da saída de jobs) com bg, fg, ou kill, pode ser usado para fazer a acção nesse trabalho.

22
22
22
2011-03-27 00:43:15 +0000

Ctrl+Z suspende o processo com o SIGTSTP, pode retomá-lo mais tarde. A Ctrl+C mata o processo com SIGINT, que termina o processo a menos que seja manuseado/assinado pelo alvo, pelo que não o pode retomar. Existe também um SIGSTOP que pode ser enviado por kill() e que o processo não pode ser interceptado. O SIGCONT é a contrapartida tanto do SIGSTOP como do SIGTSTP que não suspende o processo.

18
18
18
2011-03-27 11:52:36 +0000

CTRL+Z pára (pausa) um trabalho

CTRL+C termina um trabalho

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

fg %1

se tiver vários processos em pausa então deve fazer

jobs

para ver o output e seleccionar o número apropriado para retomar e. g. Os

fg %3

retomam o terceiro emprego da lista. Também pode ter empregos em segundo plano com

bg %n

onde n é o número do emprego.

3
3
3
2014-07-03 15:57:10 +0000

CTRL+Z pára (pausa) um trabalho

CTRL+C termina um trabalho

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

fg %1

Se tem múltiplos processos em pausa então deve fazer

jobs

para ver o resultado.

3
3
3
2014-03-13 06:48:21 +0000
Cntrl + Z pause the currently running process.
Cntrl + C simply terminates the running process.

Utilizando Cntrl + C não é possível retomar o processo. onde como utilizando Cntrl + Z é possível retomar o processo.

utilizam fg %1 para retomar o processo.

2
2
2
2013-02-26 17:19:22 +0000

As respostas anteriores estão correctas, mas por alguma razão desconhecida Ctrl-Z suspende também todos os processos das crianças, mas killall -SIGSTOP … apenas suspende o processo mais à frente (pai) e deixa as crianças a correr como elas querem.