Quelle est la différence entre Ctrl + Z et Ctrl + C en ligne de commande Unix?

Réponses:

251

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

Si vous suspendez un processus, ceci apparaîtra dans le shell pour vous dire qu'il a été suspendu:

[1]+  Stopped                 yes

Cependant, si vous en tuez un, vous ne verrez aucune confirmation autre que celle d'être renvoyé à une invite du shell. Lorsque vous suspendez un processus, vous pouvez également en faire des choses fantaisistes. Par exemple, en exécutant ceci:

fg

Avec un programme suspendu, cela le ramènera au premier plan.

Et exécuter la commande

bg

Si un programme est suspendu, il pourra s’exécuter en arrière-plan (la sortie du programme ira quand même vers le téléscripteur).

Si vous voulez tuer un programme suspendu, vous n'avez pas à le ramener en fgpremier, vous pouvez simplement faire la commande:

kill %1

Si vous avez plusieurs commandes suspendues, exécutez

jobs

les listera, comme ceci:

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

En utilisant %#, le cas #est le numéro de tâche (celle entre crochets de la jobssortie) avec bg, fg, ou kill, peut être utilisé pour effectuer l'action sur ce travail.

Wuffers
la source
3
Vous pouvez changer les touches qui font quel travail en utilisant la sttycommande. Par exemple stty susp ^Z ou stty intr ^C.
RedGrittyBrick
7
En fait, il envoie SIGTSTP, qui peut être intercepté.
Simon Richter
2
Cool! Donc, si un programme refuse de mourir avec Ctrl + C, comment forcer le tuer?
Aditya MP
2
@adityamenon Recherchez le nom de l'exécutable, par exemple, amaroket exécutez killall amarok-le ou exécutez-le ps auxet recherchez l'ID de processus en regard du nom de l'exécutable, puis exécutez-le kill {process id}.
Bruno Finger
22

Ctrl + Z suspend le processus avec SIGTSTP, vous pourrez le reprendre plus tard. Ctrl + C supprime le processus avec SIGINT, qui le termine sauf s'il est géré / ignoré par la cible, vous ne pouvez donc pas le reprendre. Il existe également un SIGSTOP qui peut être envoyé kill()et que le processus ne peut pas intercepter. SIGCONT est la contrepartie de SIGSTOP et de SIGTSTP qui annule le processus.

Ben Voigt
la source
Non, c'est SIGTSTP, pas SIGSTOP et il peut être intercepté.
sch
@sch, est-ce correct maintenant?
Ben Voigt
Oui, bien que Ctrl-Z (et CTRL-C) force un groupe de processus (le groupe de processus au premier plan du terminal) à recevoir ce signal, pas nécessairement un seul processus. Notez également que SIGTTIN et SIGTTOU sont envoyés aux processus qui ne font pas partie du groupe de processus de premier plan du terminal lorsqu’ils tentent ensuite de lire ou d’écrire à partir de celui-ci, qui les suspend également.
sch
@sch: Le processus vs groupe n'est-il pas seulement une différence dans la manière dont le signal est envoyé? IIRC kill()vous permet d’envoyer SIGSTOPà un groupe très bien.
Ben Voigt
Oui, ma commande concernait votre CTRL-Z suspend le processus ... ce qui peut induire les gens en erreur en leur faisant croire qu'il est envoyé à un seul processus alors qu'il s'agit en fait d'un groupe de travaux ou de processus .
sch
17

CTRL + Z arrête (met en pause) un travail

CTRL + C met fin à un travail

avec CTRL + C, vous ne pouvez pas reprendre le processus, mais avec CTRL + Z, vous pouvez reprendre le travail en entrant simplement la commande suivante:

fg %1

si vous avez plusieurs processus en pause, alors vous devriez faire

jobs

pour voir la sortie et sélectionner le numéro approprié à reprendre, par exemple

fg %3

reprend le troisième travail de la liste. Vous pouvez également exécuter des tâches en arrière-plan avec

bg %n

où n est le numéro de travail.

g24l
la source
Ce sont des travaux (groupes de processus) et non des processus traités par CTRL-C, CTRL-Z, fg et bg.
sch
3
Cntrl + Z pause the currently running process. 

Et

Cntrl + C simply terminates the running process.

En utilisant Ctrl + C, vous ne pouvez pas reprendre le processus. où en utilisant Ctrl + Z vous pouvez reprendre le processus.

utilisez fg% 1 pour reprendre le processus.

Ravindra Miyani
la source
3

CTRL+ Zarrête (met en pause) un travail

CTRL+ Cmet fin à un travail

Avec CTRL+, Cvous ne pouvez pas reprendre le processus, mais avec CTRL+ , vous pouvez reprendre le Ztravail en entrant simplement à l'invite de commande:

fg% 1

Si vous avez plusieurs processus en pause, alors vous devriez faire

emplois

pour voir la sortie.

abul
la source
2

Les réponses précédentes sont correctes, mais pour une raison inconnue, Ctrl-Z suspend également tous les processus enfants, mais killall -SIGSTOP ... ne suspend que le processus le plus en avant (parent) et laisse les enfants s'exécuter à leur guise.

Kostas
la source