Qual é a diferença entre Ctrl-z e Ctrl-c no terminal?


120

Alguém pode me dizer a diferença entre ctrl+ ze ctrl+ c?

Quando estou no terminal, ambas as combinações interrompem o processo atual, mas qual é exatamente a diferença entre ambas?


Eu fiz uma pergunta muito semelhante aqui: unix.stackexchange.com/questions/116959/…
ThorSummoner


sim, eu consegui entender a diferença entre os dois !!
chaitanya lakkundi

Uma coisa que quero acrescentar aqui é que a maioria dos caras (também no meu círculo profissional) não diferencia entre eles. E usou a opção CTRL-Z para finalizar o comando. Qual é a prática errada. Você deve usar CTRL-C em todas essas instâncias. Como CTRL-Z, basta colocar em segundo plano. Portanto, o processo não é finalizado até a conclusão, o que pode não ser o desejo do usuário (na maioria das vezes) quando ele pressiona CTRL-Z para finalizar.
kuldeep.kamboj

Respostas:


156

Se deixarmos os casos extremos de lado, a diferença é simples. Control+ CAborta a aplicação quase imediatamente, enquanto Control+ Zshunts-lo em segundo plano, suspenso.

O shell envia sinais diferentes para os aplicativos subjacentes nessas combinações:

  • Control+ C(caractere de controle intr) envia SIGINT, o que interromperá o aplicativo. Geralmente, o processo é interrompido, mas isso depende do aplicativo.

  • Control+ Z(caractere de controle susp) envia o SIGTSTP para um aplicativo em primeiro plano, efetivamente colocando-o em segundo plano, suspenso. Isso é útil se você precisar interromper algo como um editor para obter alguns dados necessários. Você pode voltar para o aplicativo executando fg(ou %xonde xestá o número do trabalho, como mostrado em jobs).

    Podemos testar isso executando nano TEST, pressionando Control+ Ze depois executando ps aux | grep TEST. Isso nos mostrará que o nanoprocesso ainda está em execução:

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

    Além disso, podemos ver (a partir desse T, que está na coluna de status) que o processo foi interrompido . Por isso, ainda está vivo, mas não está funcionando ... Pode ser retomado.

    Alguns aplicativos falham se eles tiverem processos externos em andamento (como uma solicitação da Web) que podem atingir o tempo limite enquanto dormem.


51
Vale acrescentar que também é possível para executar bg(em vez de fg) para reativar uma aplicação que tem sido Ctrl + Z'ed sem colocá-lo de volta para o primeiro plano; efetivamente dando a você o controle do shell que iniciou o aplicativo e do próprio aplicativo, como se você tivesse usado &ao iniciar o aplicativo. Isso muitas vezes vem a calhar quando você se esqueceu de iniciá-lo com &:)
Malte Skoruppa

6
E você pode voltar a esse processo digitando fgnovamente!
Sleblanc

4
Caso haja vários trabalhos suspensos ou em segundo plano: "jobs" os lista e "fg% n" ou "bg% n" ou até "kill% n" para colocar o job% n em primeiro plano, segundo plano ou eliminá-lo .
Olivier Dulac

3
@Oli: Seu segundo parágrafo diz: "O shell envia [s] ... sinais para os aplicativos subjacentes ...". Não, o driver do sistema operacional / terminal envia os sinais. (Em um sistema de janelas, o gerenciador de janelas pode desempenhar um papel.) Além disso, para ser concluído (embora além do escopo da pergunta original), você pode mencionar Ctrl + \.
Scott Scott

Como a sessão sabe qual grupo de processos deve retornar ao primeiro plano depois de executar um ctrl cou outro ctrl z? O padrão é o SID (bash)?
Jggunjer # 9/16

16

Control+ Zsuspende um processo ( SIGTSTP) e Control+ Cinterrompe um processo ( SIGINT)

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

Em sistemas tipo Unix, Control + Z é o mapeamento de teclado padrão mais comum para a sequência de teclas que suspende um processo

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

Nos sistemas POSIX, a sequência faz com que o programa ativo receba um sinal SIGINT. Se o programa não especificar como lidar com essa condição, ele será encerrado. Normalmente, um programa que lida com um SIGINT ainda será finalizado, ou pelo menos finalizará a tarefa em execução dentro dele.


1
Boas referências de publicação de emprego. Mas, de um modo geral, a Wikipedia não é uma fonte muito boa para referências técnicas.
Aaron

3
@ BryceAtNetwork23 isso é muito verdadeiro; Senti que, neste caso, a definição da Wikipedia era decentemente suficiente. Vou procurar mais referências técnicas no futuro!
destituído sono Bulbasaur

14

Ctrl+ Cé usado para matar um processo com sinal SIGINT, em outras palavras, é uma morte educada .

Ctrl+ Z é usado para suspender um processo enviando o sinal SIGTSTP, que é como um sinal de suspensão, que pode ser desfeito e o processo pode ser retomado novamente.

No entanto, quando um processo é suspenso, podemos retomar novamente fg(retomar em primeiro plano) e bg(retomar em segundo plano), mas não consigo retomar um processo interrompido, que é a diferença entre usar Ctrl+ C& Ctrl+ Z.

Como podemos visualizar processos suspensos?

O jobscomando fornece uma saída como esta:

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

Como matar um processo suspenso em segundo plano?

Usando o killcomando:

kill %nOnde né o número exibido pelo jobscomando. Então, se eu quero matar gato: kill %1.


1
de acordo com outros comentários neste tópico, a correção: ctrl-z envia um sinal SIGTSTP e não um SIGSTOP.
precisa saber é o seguinte

Kill% 1 me diz - Operação não permitida. Por quê então? Obrigado
Satya Prakash

7

Simplificando:

  • CTRL-C solicita que o programa seja interrompido .

  • CTRL-Z força o programa a suspender e entrar em segundo plano .

    Isso permite que você retomá-lo mais tarde com o comando fg. As tarefas em segundo plano restantes são eliminadas quando você sai do shell de logon.


5

Isso deve ajudar

Ctrl+ Zé usado para suspender um processo enviando o sinal SIGSTOP, que não pode ser interceptado pelo programa. Enquanto Ctrl+ 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.


4
Isso não é inteiramente correto. Ele envia SIGTSTP, que pode ser capturado pelo programa. Há quatro sinais diferentes, o que pode suspender um programa SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. Desses, apenas SIGSTOPnão podem ser bloqueados. Os outros três são usados ​​pelo terminal para interromper o processo sob diferentes condições.
precisa saber é

4

quando você pressiona ctrl+ c, significa que você envia o SIGINT ao seu processo. como você digite o comando: kill -SIGINT <your_pid>. Isso matará seu processo. É por isso que você não pode vê-lo ao emitir o comando ps .
Quando você pressiona ctrl+ z, significa que você envia o SIGSTOP ao seu processo. como você digite o comando: kill -SIGKSTOP <your_pid>. Parará seu processo, mas o processo ainda está vivo. Assim, você pode reativar seu processo enviando SIGCONT ao seu processo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.