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


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

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


96
2017-08-13 13:50


origine


J'ai posé une question très similaire ici: unix.stackexchange.com/questions/116959/… - ThorSummoner
Un match encore plus proche: Quelles sont les différences entre Ctrl + Z et Ctrl + C dans la ligne de commande Unix? sur Super utilisateur. - Scott
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 aussi) ne font pas la différence entre eux. Et utilisé l'option CTRL-Z pour terminer la commande. Ce qui est une mauvaise pratique. Vous devez utiliser CTRL-C sur toutes ces instances. Comme CTRL-Z simplement mettre en arrière-plan. Donc, le processus n'est pas terminé avant d'avoir terminé, ce qui peut ne pas être le désir de l'utilisateur (la plupart du temps) quand il appuie sur CTRL-Z pour terminer. - kuldeep.kamboj


Réponses:


Si on laisse de côté les cas extrêmes, la différence est simple. Contrôle+C abandonne l'application presque immédiatement Contrôle+Z la shunts en arrière-plan, suspendue.

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

  • Contrôle+C (caractère de contrôle intr) envoie SIGINT qui interrompt l'application. En général, le faire avorter, mais c'est à l'application de décider.

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

    Nous pouvons tester cela en courant nano TEST, puis en appuyant sur Contrôle+Z puis en cours d'exécution ps aux | grep TEST. Cela nous montrera la nano le processus est toujours en cours d'exécution:

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

    En outre, nous pouvons voir (à partir de ce T, qui est dans la colonne d'état) que le processus a été arrêté. Donc, il est toujours en vie, mais il ne fonctionne pas ... On peut le reprendre.

    Certaines applications se bloquent si elles ont des processus externes en cours (comme une requête Web) qui peuvent expirer pendant leur sommeil.


131
2017-08-13 13:56



Cela vaut la peine d'ajouter qu'il est également possible de courir bg (au lieu de fg) pour suspendre une application qui a été Ctrl + Z'ed sans pour autant le remettre au premier plan; vous donnant effectivement le contrôle à la fois du shell qui a lancé l'application et l'application elle-même, comme si vous aviez utilisé & au démarrage de l'application. Cela est souvent utile lorsque vous avez oublié de le démarrer avec & :) - Malte Skoruppa
Et vous pouvez revenir à ce processus en tapant fg encore! - sleblanc
Dans le cas où plusieurs travaux sont suspendus ou en arrière-plan: "jobs" les listent, et "fg% n" ou "bg% n" ou même "kill% n" pour mettre le job% n en avant-plan . - Olivier Dulac
@Oli: Votre deuxième paragraphe dit: «Le shell envoie […] des signaux aux applications sous-jacentes….» Non, le système d'exploitation / le pilote du terminal envoie les signaux. (Dans un système de fenêtre, le gestionnaire de fenêtres peut jouer un rôle.) En outre, pour être complet (même si cela dépasse le cadre de la question initiale), vous pouvez mentionner Ctrl + \. - Scott
Comment la session sait-elle quel groupe de processus doit retourner au premier plan après avoir ctrl c ou ctrl z ? Par défaut, le SID (bash)? - jiggunjer


Contrôle+Z suspend un processus (SIGTSTP) et Contrôle+C interrompt 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 fait en sorte que le programme actif reçoive un signal SIGINT. Si le programme ne spécifie pas comment gérer cette condition, il est terminé. Généralement, un programme qui gère un SIGINT se terminera tout de même, ou au moins terminera la tâche qui s'exécute à l'intérieur


14
2017-08-13 13:56



Bonnes références de publication de poste. Mais de manière générale, Wikipedia n'est pas une très bonne source de référencement technique. - Aaron
@ BryceAtNetwork23 c'est très vrai; Je sentais 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


Ctrl+C est utilisé pour tuer un processus avec signal SIGINT En d'autres termes, c'est une politesse tuer .

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

Cependant, lorsqu'un processus est suspendu, nous pouvons le reprendre en fg (resume in forground) et bg (resume in background) , mais je ne peux pas reprendre un processus tué, c'est une différence entre Ctrl+C Et Ctrl+Z.

Comment vue processus suspendu?

En utilisant la commande jobs, la sortie sera:

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

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

En utilisant tuer commande:

tuer% n où n seront les numéros affichés dans la commande des travaux, donc je veux tuer le chat: kill %1 .


10
2017-08-14 07:49



conformément aux autres commentaires de ce sujet, correction: ctrl-z envoie un signal SIGTSTP et non un SIGSTOP. - lukewendling
Kill% 1 me dit - L'opération n'est pas autorisée. Pourquoi donc Merci - Satya Prakash


Ce devrait aider

Ctrl+Z est utilisé pour suspendre un processus en lui envoyant le signal SIGSTOP, qui ne peut pas être intercepté par le programme. Tandis que Ctrl+C est utilisé pour tuer un processus avec le signal SIGINT, et peut être intercepté par un programme afin de pouvoir se nettoyer avant de quitter ou de ne pas quitter du tout.


6
2017-08-13 13:58



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


quand vous appuyez sur ctrl+c, cela signifie que vous envoyez SIGINT à votre processus. comme vous tapez cette commande: kill -SIGINT <your_pid>. Cela va vous tuer votre processus. C'est pour cela que vous ne pouvez pas le voir lorsque vous émettez ps commander.
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 est toujours en vie. Vous pouvez donc réactiver votre processus en envoyant SIGCONT à votre processus.


3
2017-08-14 07:24





Pour le dire simplement:

  • CTRL-C demande que le programme avorter.

  • CTRL-Z oblige le programme à suspendre et aller 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.


3
2017-08-15 00:39