¿Cuál es la diferencia entre Ctrl-z y Ctrl-c en la terminal?

120

¿Alguien puede decirme la diferencia entre ctrl+ zy ctrl+ c?

Cuando estoy en la terminal, ambas combinaciones detienen el proceso actual, pero ¿cuál es exactamente la diferencia entre ambas?

chaitanya lakkundi
fuente
He hecho una pregunta muy similar aquí: unix.stackexchange.com/questions/116959/…
ThorSummoner
sí, tuve éxito en comprender la diferencia entre ambos !!
chaitanya lakkundi
Una cosa que quiero agregar aquí, es que la mayoría de los chicos (también en mi círculo profesional) no diferencian entre ellos. Y usó la opción CTRL-Z para terminar el comando. Lo cual es una práctica incorrecta. Debe usar CTRL-C en todas estas instancias. Como CTRL-Z simplemente se pone en segundo plano. Por lo tanto, el proceso no finaliza hasta que se complete, lo que puede no ser el deseo del Usuario (la mayoría de las veces) cuando presiona CTRL-Z para finalizar.
kuldeep.kamboj

Respuestas:

156

Si dejamos los casos extremos a un lado, la diferencia es simple. Control+ Caborta la aplicación casi inmediatamente mientras Control+ la Zdesvía hacia el fondo, suspendida.

El shell envía diferentes señales a las aplicaciones subyacentes en estas combinaciones:

  • Control+ C(carácter de control intr) envía SIGINT que interrumpirá la aplicación. Por lo general, lo hace abortar, pero esto depende de la aplicación para decidir.

  • Control+ Z(carácter de control susp) envía SIGTSTP a una aplicación en primer plano, colocándola efectivamente en segundo plano, suspendida. Esto es útil si necesita salir de algo como un editor para obtener algunos datos que necesita. Puede volver a la aplicación ejecutando fg(o %xdónde xestá el número de trabajo como se muestra en jobs).

    Podemos probar esto corriendo nano TEST, luego presionando Control+ Zy luego corriendo ps aux | grep TEST. Esto nos mostrará que el nanoproceso aún se está ejecutando:

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

    Además, podemos ver (a partir de esa T, que está en la columna de estado) que el proceso se ha detenido . Entonces todavía está vivo, pero no se está ejecutando ... Se puede reanudar.

    Algunas aplicaciones se bloquean si tienen procesos externos en curso (como una solicitud web) que pueden exceder el tiempo de espera mientras están dormidos.

Oli
fuente
51
Vale la pena agregar que también es posible ejecutar bg(en lugar de fg) para suspender una aplicación que ha sido Ctrl + Z'ed sin volver a ponerla en primer plano; dándole efectivamente el control tanto del shell que inició la aplicación como de la aplicación en sí, como si lo hubiera utilizado &al iniciar la aplicación. Esto suele ser útil cuando olvidaste comenzar con &:)
Malte Skoruppa
66
¡Y puede volver a ese proceso escribiendo de fgnuevo!
sleblanc
44
En caso de que haya varios trabajos suspendidos o en segundo plano: "trabajos" los enumera, y "fg% n" o "bg% n" o incluso "kill% n" para poner el trabajo% n en primer plano, en segundo plano o matarlo .
Olivier Dulac
3
@Oli: Su segundo párrafo dice: "El shell envía [s] ... señales a las aplicaciones subyacentes ..." No, el sistema operativo / controlador de terminal envía las señales. (En un sistema de ventanas, el administrador de ventanas puede desempeñar un papel). Además, para completar (aunque fuera del alcance de la pregunta original), es posible que desee mencionar Ctrl + \.
Scott
¿Cómo sabe la sesión qué grupo de procesos tiene que volver al primer plano después de hacer una ctrl co ctrl z? Por defecto es el SID (bash)?
jiggunjer
16

Control+ Zsuspende un proceso ( SIGTSTP) e Control+ Cinterrumpe un proceso ( SIGINT)

http://en.wikipedia.org/wiki/Control-Z

En sistemas tipo Unix, Control + Z es la asignación de teclado predeterminada más común para la secuencia de teclas que suspende un proceso

http://en.wikipedia.org/wiki/Control-C

En los sistemas POSIX, la secuencia hace que el programa activo reciba una señal SIGINT. Si el programa no especifica cómo manejar esta condición, se termina. Por lo general, un programa que maneja un SIGINT todavía terminará, o al menos terminará la tarea que se ejecuta dentro de él

Bulbasaur privado de sueño
fuente
1
Buen trabajo publicando referencias. Pero en términos generales, Wikipedia no es una muy buena fuente para referencias técnicas.
Aaron
3
@ BryceAtNetwork23 eso es muy cierto; Sentí en este caso que la definición de Wikipedia era decentemente suficiente. ¡Sin embargo, buscaré más referencias técnicas en el futuro!
Dormido Bulbasaur privado
14

Ctrl+ Cse usa para matar un proceso con señal SIGINT, en otras palabras, es una muerte educada .

Ctrl+ Z se usa para suspender un proceso enviándole la señal SIGTSTP, que es como una señal de suspensión, que se puede deshacer y el proceso se puede reanudar nuevamente.

Sin embargo, cuando se suspende un proceso, podemos reanudarlo nuevamente fg(reanudar en primer plano) y bg(reanudar en segundo plano), pero no puedo reanudar un proceso finalizado, esa es una diferencia entre usar Ctrl+ Cy Ctrl+ Z.

¿Cómo podemos ver los procesos suspendidos?

El jobscomando da una salida como esta:

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

¿Cómo matar un proceso suspendido en segundo plano?

Al usar el killcomando:

kill %ndonde nes el número que muestra el jobscomando Así que si quiero matar gato: kill %1.

nux
fuente
1
de acuerdo con otros comentarios en este hilo, corrección: ctrl-z envía una señal SIGTSTP, no un SIGSTOP.
lukewendling
Kill% 1 me dice: operación no permitida. ¿Porque? Gracias
Satya Prakash
7

Para hacerlo mas simple:

  • CTRL-C solicita que el programa se cancele .

  • CTRL-Z obliga al programa a suspender y pasar a un segundo plano .

    Esto le permite reanudarlo más tarde con el comando fg. Las tareas en segundo plano restantes se eliminan cuando sale del shell de inicio de sesión.

thomasrutter
fuente
5

Esto debería ayudar

Ctrl+ Zse utiliza para suspender un proceso enviándole la señal SIGSTOP, que el programa no puede interceptar. Mientras Ctrl+ 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.

Graham
fuente
44
Esto no es del todo correcto. Envía SIGTSTP, que puede ser atrapado por el programa. Hay cuatro señales diferentes, que pueden suspender un programa SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. De esos solo SIGSTOPno se pueden bloquear. El terminal usa los otros tres para detener el proceso en diferentes condiciones.
kasperd
4

cuando presiona ctrl+ c, significa que envía SIGINT a su proceso. como se escribe este comando: kill -SIGINT <your_pid>. Te matará tu proceso. Es por eso que no puede verlo cuando emite el comando ps .
Cuando presiona ctrl+ z, significa que envía SIGSTOP a su proceso. como se escribe este comando: kill -SIGKSTOP <your_pid>. Se detendrá su proceso, pero el proceso sigue vivo. Para que pueda reactivar su proceso enviando SIGCONT a su proceso.

VENENO
fuente