Ctrl c vs. Ctrl z con trabajo en primer plano

26

Ctrl+ Zdetiene el trabajo mientras que Ctrl+ lo Cmata.

¿Porqué es eso? ¿No tendría el otro sentido más sentido?

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
fuente
44
"¿No tendría más sentido lo contrario?" ¿Podría especificar por qué cree que lo haría?
glglgl

Respuestas:

55

Creo que puede estar confundido acerca de la notación de control de trabajo. Notablemente "Detenido" significa que un trabajo aún está vivo pero que su capacidad para procesar cualquier cosa se ha mantenido (no se le da tiempo en la CPU para procesar nada). Este es efectivamente un estado de "Pausa" o "Suspendido", aunque ese no es el término técnico correcto.

  • CtrlCno "detiene" un trabajo, lo cancela o lo mata. Técnicamente, hace que se envíe una señal de interrupción al programa diciéndole que cancele lo que está haciendo y salga inmediatamente. Algunos programas escucharán esta señal y realizarán un trabajo de limpieza de emergencia en ellos mismos antes de salir. Otros no responderán a la señal y, posteriormente, solo serán abortados.

  • CtrlZ, por otro lado, "detiene" un trabajo. De nuevo, esto se hace con una señal, pero esta vez es una señal de "parada" en lugar de una señal de "interrupción". Esto efectivamente lo pone en espera y devuelve el control al shell, pero en realidad no mata el trabajo. Si desea que dicho trabajo continúe ejecutándose, puede emitir un bgcomando para enviar el último trabajo detenido al fondo. Luego continuará ejecutándose como un trabajo en segundo plano como si lo hubiera ejecutado &en primer lugar. También puede usar fgpara reanudar el último trabajo detenido en primer plano (lo que le permite continuar donde lo dejó y le permite interactuar con él nuevamente).

Caleb
fuente
Sigo pensando que Ctrl + Z enviará SIGKILL y Ctrl + C enviará SIGINIT. Entonces, Ctrl + Z también mataría el trabajo. Pero de mi ejemplo, Ctrl + Z solo detiene el trabajo como dijiste. Entonces me confunde un poco.
neo0
10
@ neo0: ¿tal vez estás acostumbrado a alguna configuración personalizada extraña? Puede configurar esas cosas, aunque probablemente no debería en caso de que tenga una aplicación que se base en esos mapas. Pero la configuración predeterminada es CTRL+C=SIGINTy CTRL+Z=SIGTSTP.
mikeserv
3
Caleb tiene razón (+1). El ctrl-Z detiene el programa, lo que debe considerar como "congelado", pero ese programa todavía está en la memoria, sus archivos abiertos, etc. No se elimina / finaliza.
Olivier Dulac
"Suspender" podría ser más claro que "detener".
Russell Borogove
1
@jiggunjer Eso es sobre la forma de las cosas. Esta respuesta ofrece algunos antecedentes sobre por qué se requieren dos pasos y este presenta algunas funciones para hacer que esos pasos sean más sencillos.
Caleb