Quelle est la différence entre Ctrl-z et Ctrl-c dans le terminal?

120

Quelqu'un peut-il me dire la différence entre ctrl+ zet ctrl+ c?

Lorsque je suis dans le terminal, les deux combinaisons arrêtent le processus en cours, mais quelle est exactement la différence entre les deux?

chaitanya lakkundi
la source
J'ai posé une question très similaire ici: unix.stackexchange.com/questions/116959/…
ThorSummoner
oui j'ai réussi à comprendre la différence entre les deux !!
chaitanya lakkundi
Une chose que je veux ajouter ici, c'est que la plupart des gars (dans mon cercle professionnel également) ne les différencient pas. Et utilisé l'option CTRL-Z pour terminer la commande. Quelle est la mauvaise pratique. Vous devez utiliser CTRL-C sur toutes ces instances. Comme CTRL-Z, mettez simplement en arrière-plan. Ainsi, le processus n'est pas terminé avant la fin, ce qui n'est peut-être pas le souhait de l'utilisateur (la plupart du temps) lorsqu'il appuie sur CTRL-Z pour mettre fin.
kuldeep.kamboj

Réponses:

156

Si nous laissons les cas marginaux de côté, la différence est simple. Control+ Cabandonne l'application presque immédiatement alors que Control+ la Zplace en arrière-plan, suspendue.

Le shell envoie des signaux différents aux applications sous-jacentes sur ces combinaisons:

  • Control+ C(caractère de contrôle intr) envoie SIGINT qui interrompra l'application. Généralement, il provoque l’abandon, mais c’est à l’application de décider.

  • Control+ Z(caractère de contrôle susp) envoie SIGTSTP à une application de premier plan, le mettant effectivement en arrière-plan, suspendu. Ceci est utile si vous avez besoin de sortir d'un éditeur de texte pour récupérer des données dont vous avez besoin. Vous pouvez revenir à l'application en exécutant fg(ou %xoù se xtrouve le numéro du travail, comme indiqué dans jobs).

    Nous pouvons tester cela en exécutant nano TEST, puis en appuyant sur Control+ Zpuis en cours d'exécution ps aux | grep TEST. Cela nous montrera que le nanoprocessus est toujours en cours:

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

    De plus, nous pouvons voir (à partir de ce T, qui se trouve dans la colonne d'état) que le processus a été arrêté . Donc, il est toujours en vie, mais il ne fonctionne pas ... Il peut être repris.

    Certaines applications se bloqueront si elles ont des processus externes en cours (comme une demande Web) pouvant expirer pendant leur sommeil.

Oli
la source
51
Cela vaut la peine d'ajouter qu'il est également possible d'exécuter bg(au lieu de fg) de suspendre une application qui a été Ctrl + Z ' sans la remettre au premier plan; vous permettant de contrôler efficacement à la fois le shell qui a lancé l'application et l'application elle-même, comme si vous l'aviez utilisée &lors du démarrage de l'application. Cela est souvent utile lorsque vous avez oublié de commencer avec &:)
Malte Skoruppa
6
Et vous pouvez revenir à ce processus en tapant à fgnouveau!
sleblanc
4
Dans le cas où plusieurs travaux sont suspendus ou en arrière-plan: "travaux" les répertorier et "fg% n" ou "bg% n" ou même "kill% n" pour placer le travail% n au premier plan, en arrière-plan ou le supprimer. .
Olivier Dulac
3
@Oli: Votre deuxième paragraphe dit: «Le shell envoie des signaux aux applications sous-jacentes….» Non, le pilote du système d'exploitation / du terminal envoie les signaux. (Dans un système de fenêtres, le gestionnaire de fenêtres peut jouer un rôle.) De même, pour être complet (bien au-delà de la question d'origine), vous souhaiterez peut-être mentionner Ctrl + \.
Scott
Comment la session sait-elle quel groupe de processus doit revenir au premier plan après avoir effectué l'une ctrl cou l' autre ctrl z? La valeur par défaut est-elle le SID (bash)?
Jiggunjer
16

Control+ Zsuspend un processus ( SIGTSTP) et Control+ Cinterrompt un processus ( SIGINT)

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

Sur les systèmes de type Unix, Control + Z est le mappage de clavier par défaut le plus courant pour la séquence de touches qui suspend un processus.

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

Dans les systèmes POSIX, la séquence entraîne la réception d'un signal SIGINT par le programme actif. Si le programme ne spécifie pas comment gérer cette condition, elle est terminée. En règle générale, un programme qui gère un SIGINT se termine toujours ou met au moins fin à la tâche en cours d'exécution à l'intérieur de celui-ci.

Bulbasaur Sommeil Privé
la source
1
Bonnes références d'affichage d'emploi. Mais d’une manière générale, Wikipedia n’est pas une très bonne source de référencement technique.
Aaron
3
@ BryceAtNetwork23 c'est très vrai; Je pensais dans ce cas que la définition de Wikipedia était décemment suffisante. Je chercherai plus de références techniques dans le futur!
Sleep Deprived Bulbasaur
14

Ctrl+ Cest utilisé pour tuer un processus avec signal SIGINT, autrement dit, il s'agit d'un kill poli .

Ctrl+ Z est utilisé pour suspendre un processus en lui envoyant le signal SIGTSTP, qui est comme un signal de sommeil, qui peut être annulé et le processus peut être repris à nouveau.

Cependant, lorsqu'un processus est suspendu, nous pouvons le reprendre par fg(reprendre au premier plan) et bg(reprendre en arrière-plan), mais je ne peux pas reprendre un processus arrêté, c'est une différence entre utiliser Ctrl+ C& Ctrl+ Z.

Comment pouvons-nous voir les processus suspendus?

La jobscommande donne une sortie comme ceci:

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

Comment tuer un processus suspendu en arrière-plan?

En utilisant la killcommande:

kill %nnest le nombre affiché par la jobscommande. Donc , si je veux tuer le chat: kill %1.

nux
la source
1
Conformément aux autres commentaires de ce fil, correction: ctrl-z envoie un signal SIGTSTP et non un SIGSTOP.
Lukewendling
Tuer% 1 me dit - Opération non autorisée. Pourquoi Merci
Satya Prakash
7

Pour le dire simplement:

  • CTRL-C demande que le programme soit annulé .

  • CTRL-Z oblige le programme à suspendre et à passer en arrière-plan .

    Cela vous permet de le reprendre plus tard avec la commande fg. Les tâches d'arrière-plan restantes sont supprimées lorsque vous quittez le shell de connexion.

thomasrutter
la source
5

Cela devrait aider

Ctrl+ Zest utilisé pour suspendre un processus en lui envoyant le signal SIGSTOP, qui ne peut pas être intercepté par le programme. While Ctrl+ Cest utilisé pour tuer un processus avec le signal SIGINT et peut être intercepté par un programme afin qu'il puisse se nettoyer avant de quitter ou ne pas sortir du tout.

Graham
la source
4
Ce n'est pas tout à fait correct. Il envoie SIGTSTP, qui peut être attrapé par le programme. Il y a quatre signaux différents, qui peuvent suspendre un programme SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. De ceux-là seulement ne SIGSTOPpeuvent pas être bloqués. Les trois autres sont utilisés par le terminal pour arrêter le processus dans différentes conditions.
Kasperd
4

lorsque vous appuyez sur ctrl+ c, cela signifie que vous envoyez SIGINT à votre processus. comme vous tapez cette commande: kill -SIGINT <your_pid>. Cela vous tuera votre processus. C'est pourquoi vous ne pouvez pas le voir lorsque vous lancez la commande ps .
Lorsque vous appuyez sur ctrl+ z, cela signifie que vous envoyez SIGSTOP à votre processus. comme vous tapez cette commande: kill -SIGKSTOP <your_pid>. Cela arrêtera votre processus, mais le processus sera toujours actif. Vous pouvez donc réactiver votre processus en envoyant SIGCONT à votre processus.

POISON
la source