¿Qué diferencia hay entre Ctrl + Z y Ctrl + C en la línea de comandos de Unix?

Respuestas:

251

Control+ Zse utiliza para suspender un proceso enviándole la señal SIGSTOP, que el programa no puede interceptar. Mientras Control+ Cse usa para matar un proceso con la señal SIGINT, y puede ser interceptado por un programa para que pueda limpiarse antes de salir o no salir del todo.

Si suspende un proceso, esto aparecerá en el shell para indicarle que se ha suspendido:

[1]+  Stopped                 yes

Sin embargo, si matas a uno, no verás ninguna confirmación que no sea volver a un indicador de shell. Cuando suspende un proceso, también puede hacer cosas elegantes con él. Por ejemplo, ejecutando esto:

fg

Con un programa suspendido lo traerá de vuelta al primer plano.

Y ejecutando el comando

bg

Con un programa suspendido le permitirá ejecutarse en segundo plano (sin embargo, la salida del programa seguirá yendo al TTY).

Si desea matar un programa suspendido, no tiene que traerlo de vuelta fgprimero, simplemente puede hacer el comando:

kill %1

Si tiene varios comandos suspendidos, ejecute

jobs

los enumeraremos así:

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

Utilizando %#, en donde #es el número de trabajo (el que está entre corchetes de la jobssalida) con bg, fgo kill, puede ser utilizado para realizar la acción en ese trabajo.

Wuffers
fuente
3
Puede cambiar qué teclas hacen qué trabajo utilizando el sttycomando. Por ejemplo stty susp ^Z o stty intr ^C.
RedGrittyBrick
77
En realidad, envía SIGTSTP, que puede ser interceptado.
Simon Richter
2
¡Bueno! Entonces, si un programa se niega a morir con Ctrl + C, ¿cómo obliga a matarlo?
Aditya MP
2
@adityamenon Busque el nombre del ejecutable, por ejemplo, amaroky ejecute killall amarok, o ejecute ps auxy encuentre la identificación del proceso junto al nombre del ejecutable y ejecute kill {process id}.
Bruno Finger
22

Ctrl + Z suspende el proceso con SIGTSTP, puede reanudarlo más tarde. Ctrl + C mata el proceso con SIGINT, que finaliza el proceso a menos que el objetivo lo maneje / ignore, por lo que no puede reanudarlo. También hay un SIGSTOP que puede enviar kill()y que el proceso no puede interceptar. SIGCONT es la contraparte de SIGSTOP y SIGTSTP que suspende el proceso.

Ben Voigt
fuente
No, eso es SIGTSTP, no SIGSTOP y puede ser interceptado.
sch
@sch, ¿es correcto ahora?
Ben Voigt
Sí, aunque Ctrl-Z (y CTRL-C) hace que un grupo de procesos (el grupo de procesos en primer plano del terminal) reciba esa señal, no necesariamente solo un proceso. También tenga en cuenta que SIGTTIN y SIGTTOU se envían a los procesos que no están en el grupo de procesos en primer plano del terminal cuando intentan leer o escribir desde él, que también los suspenden.
sch
@sch: ¿No es el proceso vs grupo solo una diferencia en cómo se envía la señal? IIRC kill()te permite enviar SIGSTOPa un grupo muy bien.
Ben Voigt
Sí, mi orden fue sobre su CTRL-Z suspende el proceso ... lo que puede inducir a error a la gente a pensar que se envía a un solo proceso cuando en realidad es un trabajo o grupo de procesos .
sch
17

CTRL + Z detiene (pausa) un trabajo

CTRL + C finaliza un trabajo

con CTRL + C no puede reanudar el proceso, pero con CTRL + Z el trabajo puede reanudarse simplemente ingresando en el símbolo del sistema:

fg %1

si tiene varios procesos en pausa, entonces debe hacer

jobs

para ver la salida y seleccionar el número apropiado para reanudar, por ejemplo

fg %3

reanuda el tercer trabajo en la lista. También puede tener trabajos ejecutándose en segundo plano con

bg %n

donde n es el número de trabajo.

g24l
fuente
Son trabajos (grupos de procesos), no procesos con los que se ocupan CTRL-C, CTRL-Z, fg y bg.
sch
3
Cntrl + Z pause the currently running process. 

Y

Cntrl + C simply terminates the running process.

Usando Cntrl + C no puede reanudar el proceso. donde al usar Cntrl + Z puede reanudar el proceso.

use fg% 1 para reanudar el proceso.

Ravindra Miyani
fuente
3

CTRL+ Zdetiene (pausa) un trabajo

CTRL+ Ctermina un trabajo

Con CTRL+ Cno puede reanudar el proceso, pero con CTRL+ Zel trabajo puede reanudarse simplemente ingresando en el símbolo del sistema:

fg% 1

Si tiene varios procesos en pausa, entonces debe hacer

trabajos

para ver la salida.

abul
fuente
2

Las respuestas anteriores son correctas, pero por alguna razón desconocida, Ctrl-Z suspende todos los procesos secundarios también, pero killall -SIGSTOP ... solo suspende el proceso principal (principal) y deja que los hijos se ejecuten como quieran.

Kostas
fuente