ctrl c vs ctrl z avec travail de premier plan

26

Ctrl+ Zarrête le travail tandis que Ctrl+ le Ctue.

Pourquoi donc? Est-ce que l'autre sens n'aurait pas plus de sens?

z@z-lap:~$ sleep 100&
[1] 4458
z@z-lap:~$ sleep 200&
[2] 4459
z@z-lap:~$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^Z
[1]+  Stopped                 sleep 100
z@z-lap:~$ jobs
[1]+  Stopped                 sleep 100
[2]-  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^C
z@z-lap:~$ jobs
[2]+  Running                 sleep 200 &
neo0
la source
4
"Est-ce que l'autre sens n'aurait pas plus de sens?" Pourriez-vous préciser pourquoi vous pensez que ce serait le cas?
glglgl

Réponses:

55

Je pense que vous pouvez être confus au sujet de la notation du contrôle des tâches. Notamment "Arrêté" signifie qu'un travail est toujours en vie mais que sa capacité à traiter quoi que ce soit a été maintenue (il n'y a pas de temps sur le CPU pour traiter quoi que ce soit). Il s'agit en fait d'un état "Pause" ou "Suspendu", bien que ce ne soit pas le terme technique correct.

  • CtrlCn'arrête pas un travail, il l'annule ou le tue. Techniquement, cela provoque l'envoi d'un signal d'interruption au programme lui disant d'interrompre ce qu'il fait et de quitter immédiatement. Certains programmes entendront ce signal et effectueront un nettoyage d'urgence sur eux-mêmes avant de quitter. D'autres ne répondent pas au signal et sont ensuite simplement interrompus.

  • CtrlZd'autre part, "arrête" un travail. Encore une fois, cela se fait avec un signal, mais cette fois, il s'agit d'un signal «stop» au lieu d'un signal «interruption». Cela le met effectivement en attente et rend le contrôle au shell, mais ne tue pas réellement le travail. Si vous souhaitez qu'un tel travail continue de s'exécuter, vous pouvez alors émettre une bgcommande pour envoyer le dernier travail arrêté à l'arrière-plan. Il continuera ensuite à fonctionner comme un travail d'arrière-plan comme si vous l'aviez exécuté &en premier lieu. Vous pouvez également utiliser fgpour reprendre le dernier travail arrêté au premier plan (lui permettant de continuer là où il s'était arrêté et vous permettant d'interagir à nouveau avec lui).

Caleb
la source
Je pense toujours que Ctrl + Z enverra SIGKILL et Ctrl + C enverra SIGINIT. Donc, le Ctrl + Z tue également le travail. Mais d'après mon exemple, Ctrl + Z arrête uniquement le travail comme vous l'avez dit. Donc ça me rend un peu confus.
neo0
10
@ neo0 - vous êtes peut-être habitué à une configuration personnalisée bizarre? Vous pouvez configurer ce genre de choses - mais vous ne devriez probablement pas le faire si vous avez une application qui s'appuie sur ces cartes. Mais la configuration par défaut est CTRL+C=SIGINTet CTRL+Z=SIGTSTP.
mikeserv
3
Caleb a raison (+1). Le ctrl-Z arrête le programme, que vous devriez considérer comme "le gelant", mais ce programme est toujours en mémoire, ses fichiers sont ouverts, etc. Il n'est pas tué / terminé.
Olivier Dulac
"Suspendre" pourrait être plus clair que "arrêter".
Russell Borogove
1
@jiggunjer C'est à peu près la forme des choses. Cette réponse donne un aperçu de la raison pour laquelle deux étapes sont nécessaires et celle-ci présente certaines fonctions pour rendre ces étapes plus indolores.
Caleb