109 votes

Quelle est la différence entre ^C et ^D pour le terminal UNIX/Mac OS X ?

Quand j'essaie d'arrêter quelque chose, j'utilise ^C et parfois ^D dans le terminal.

Quelle est la différence entre les deux ? Pourquoi certains programmes ne répondent pas aux ^C mais ^D . Pourquoi le Terminal.app se ferme lorsque j'utilise ^D ?

100voto

Ignacio Vazquez-Abrams Points 107432

CtrlC indique au terminal d'envoyer un SIGINT au processus d'avant-plan actuel, ce qui se traduit par défaut par la fin de l'application. CtrlD indique au terminal qu'il doit enregistrer un EOF sur l'entrée standard, ce que bash interprète comme un désir de quitter.

93voto

Ctrl + D ( ^D ) signifie fin du fichier . Il ne fonctionne qu'au début d'une ligne (je simplifie un peu), et n'a aucun effet si le programme ne lit pas les entrées du terminal. Dans votre expérience, ^D a dit au Shell que vous n'alliez pas taper d'autres commandes, alors il a quitté ; puis le terminal a quitté parce que son sous-programme s'était terminé.

Ctrl + C ( ^C ) signifie "interrompre", c'est-à-dire arrêter ce que vous êtes en train de faire. Techniquement, appuyer sur ^C envoie le Signal INT qui, par défaut, met fin à une application, mais qui, dans de nombreux programmes, signifie revenir au niveau supérieur (par exemple, dans un Shell, arrêter de taper une ligne de commande et revenir à un prompt immaculé).

Si un programme ne répond pas à ^C vous pouvez essayer Ctrl + \ ( ^\ ). Cela envoie le Signal QUIT qui par défaut met fin à une application, et que peu de programmes interceptent.

Une autre clé qui envoie un signal est Ctrl + Z ( ^Z ). Il envoie le Signal TSTP qui met en pause le programme en cours d'exécution au premier plan. (TSTP est l'abréviation de "terminal stop" ; c'est similaire à STOP mais TSTP peut être ignoré alors que STOP ne peut pas l'être). Depuis le Shell, vous pouvez reprendre l'exécution de ce programme avec la commande fg (reprise au premier plan) ou la commande bg (reprise en arrière-plan).

Toutes ces touches peuvent être modifiées avec la fonction stty commandement. Certains programmes, en particulier les programmes plein écran qui ont des liaisons de touches, les désactivent.

4voto

iisystems Points 393

En complément des deux très bonnes réponses ci-dessus, voici un exemple :

Si vous tapez python dans le Shell, cela vous amène dans l'invite >>> de Python.

Maintenant, si vous tapez Ctrl+C il dira KeyboardInterrupt et rester dans le >>>.
Si vous entrez dans un boucle for, par exemple en tapant for x in (text): il attend que vous tapiez plus loin en affichant une invite ..., si vous appuyez sur Ctrl+C maintenant, il va sortir de l'instruction for et revenir à l'invite >>>.
Si vous frappez Ctrl+D à n'importe quel moment, que ce soit dans >>> ou ... il sortira de l'invite Python et retournera au Shell d'origine.

De même, si l'on se connecte par ssh à une autre machine, une Ctrl+C mettra fin à toutes les commandes existantes, Ctrl+D fera cela et sortira également de la machine. (De même, le Delete est la même chose que de faire un Ctrl+D )

0voto

David Petrov Points 1

Certains programmes incluent la gestion des signaux en utilisant sigaction comme moyen de ne pas communiquer avec les processus enfants. Lorsque vous souhaitez ne pas envoyer de signaux pendant un certain processus d'un programme important, choisissez d'implémenter la gestion des signaux. Cela peut répondre à votre question de savoir pourquoi certains programmes ne se terminent pas lorsqu'ils envoient un signal SIGINT (^c). Dans le cadre du mécanisme de sécurité fourni par le système d'exploitation, SIGKILL (^d) est spécial dans la mesure où il met toujours fin au programme.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X