¿Presionar ctrl-c varias veces hace que el programa en ejecución se cierre más rápidamente?

41

A menudo empiezo a leer un archivo enorme y luego quiero salir después de un tiempo, pero hay un retraso al presionar
Ctrl+ Cpara que el programa se detenga. ¿Hay alguna posibilidad de acortar el retraso presionando la tecla Ctrl+ Cvarias veces? ¿O estoy malgastando mis pulsaciones de teclas?

El gato no divertido
fuente
He notado que cuando ejecuto un proceso que llama varios procesos secundarios, Ctrl-C a veces interrumpe el proceso secundario, pero no el proceso primario. Eso es cierto en bash, pero no es el caso en el zshque siempre cierra el padre. Es una de las razones que me gustan zsh.
joeytwiddle
17
Sí, al igual que al presionar el botón del elevador o el botón de cruzar varias veces, el elevador llegará antes o la luz se volverá verde más rápido.
Michael
3
Sí, al igual que los botones de elevador y cruce de peatones, CTRL-C también puede ponerse pegajoso u oxidado o desarrollar conexiones dudosas. Presionar más veces es una buena táctica porque solo una prensa tiene que registrarse para que llegue el elevador, que se ilumine el letrero de caminar o que se cierre el programa.
hippietrail
1
@hippietrail pero su caparazón se imprimirá ^Ccuando registre la prensa (al menos bash sí)
wchargin
1
Por lo que vale, no considero que desperdicie mis pulsaciones de teclas, considero que desahoga cierta frustración de una manera no perjudicial. (Por lo general golpeó 2-3 veces, pero eso es en parte porque "crecí en" terminales conectados a través de líneas telefónicas en las que no siempre se puede contar con cada pulsación única de llegar a la máquina.)
keshlam

Respuestas:

35

Después del primero Ctrl-C, el programa recibirá SIGINTy generalmente comenzará a limpiar (eliminar archivos tmp, cerrar sockets, etc.). Si golpea de Ctrl-Cnuevo mientras eso está sucediendo, puede suceder que interrumpa la rutina de limpieza (es decir, se podría actuar sobre la señal adicional en lugar de quedarse sola), dejando un desastre. Si bien esto generalmente no es el caso, más comúnmente las señales adicionales se envían despuésel proceso finalizó (debido a los retrasos inherentes en la interacción del operador con el sistema). Eso significa que las señales son recibidas por otro proceso (a menudo shell, pero no siempre). Si ese destinatario no maneja esta señal correctamente (como suele hacer Shell, vea la respuesta de Jenny D), puede que le sorprenda desagradablemente el resultado de tal acción.

John1024
fuente
¿Por qué debería interrumpir la rutina de limpieza? Es solo otra señal de INTque el proceso recibe.
caos
44
@chaos ¿Por qué debería? Debería hacerlo si la rutina de limpieza se ha colgado y desea detenerla. ¿Funciona realmente de esta manera? Si, bastante seguido. Puedes demostrarlo de manera bastante simple: crea un script bash con una sola línea trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Ejecute el script y presione ctrl-C dos veces. Verá que el segundo ctrl-C se pasa a la rutina de "limpieza" (en la instrucción trap) y finaliza su sleepcomando.
John1024
1
@ John1024 Ah, ahora lo veo. Gracias por el fragmento de script ^^ Pero, la limpieza no se cancela, vea: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10son solo los sleepcomandos los que reciben las señales. Ambos estábamos equivocados xD
caos
2
Eso es incorrecto La entrega de la señal es sincrónica. Si isigestá activado, en cuanto CTRL-C es presionado y recibido por el núcleo (para un emulador de terminal, tan pronto como el emulador de terminal lo escribe en el lado maestro del pseudo-terminal), la señal SIGINT se envía a todos los procesos en el grupo de procesos en primer plano de la terminal. Puede estar bloqueado allí, pero no se entregará más tarde a otro proceso. Incluso si el búfer del dispositivo terminal está lleno (las aplicaciones no han leído nada de lo que escribió), el CTRL-C saltará la cola.
Stéphane Chazelas
1
Sí, como ejemplo, VLC interpreta múltiples señales Ctrl + C como una forma de salir impuro, mientras que un solo Ctrl + C intentará salir limpiamente.
Jeremy Visser
11

Los estás desperdiciando. Todo lo que sucede es que una vez que el servidor termina con la salida de la pantalla, recibirá múltiples Ctrl-C. El primero se usará para matar el proceso, y los siguientes terminarán en su shell, que luego se verá como

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 
Jenny D
fuente
66
El proceso no necesariamente se cierra al enviarle un SIGINT. Podría mantenerse vivo indefinidamente y hacer algo diferente cada vez que se presione Ctrl + C.
Brian Gordon
Cierto. Estaba haciendo suposiciones sobre cómo el usuario está leyendo el archivo.
Jenny D
5

Respuesta corta : si el proceso reacciona a él.

Respuesta larga : cuando presionas ctrl+ cel kernel envía una señal al proceso. Qué señal se puede determinar mediante el siguiente comando:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Vea la página de manual de stty:

   intr CHAR
          CHAR will send an interrupt signal

Es la señal INT, también conocida como número 2. Cuando el proceso tiene un controlador de señal, puede reaccionar a esto. La mayoría de los procesos realizan algunos trabajos de limpieza para finalizar con éxito.

caos
fuente
Ctrl-Z generalmente envía SIGTSTP que puede manejarse (a diferencia de SIGSTOP).
Peter
44
No, no es el shell el que envía el SIGINT al proceso. Es kernel(la disciplina de línea del terminal, el controlador del terminal) que envía SIGINT a cada proceso en el grupo de procesos en primer plano del terminal.
Stéphane Chazelas
Futuros lectores, también ver unix.stackexchange.com/a/120071/135943 .
Comodín
4

Tienes razón. Las pulsaciones de teclas se están desperdiciando. Cuando presiona Crtl+Cy se detecta, hay recursos que deben borrarse, por lo que lleva tiempo. El único caso posible que sé donde Ctrl+Cse requiere presionar es cuando desea cancelar un proceso de actualización de Yum, donde Yum requiere que presione Ctrl+Cdos veces para confirmar que realmente desea cancelar.

Nav
fuente
2

Aunque solo uno Ctrl-Ces necesario en el caso general, hay algunas situaciones en las que puede ser necesario. Python, por ejemplo, atrapa Ctrl-Ccuando se genera un nuevo subproceso, por lo que si algo sale mal al iniciar muchos subprocesos, es necesario volver a enviarlo varias veces para que pueda pasar al pythonproceso principal sin ser atrapado

Patrick Collins
fuente
1
Esto me sucede de vez en cuando cuando creo scripts python multiproceso / procesados. A veces se necesitan varias prensas antes de que se elimine el proceso principal.
Leo
0

Yo siempre tiene que pulsar Ctrlcvarias veces. Nunca he tenido que responder en la primera pulsación, y tengo que usarlo varias veces hasta que el sistema realmente se da cuenta de que hay un Ctrlcenvío. Parece que en realidad se pierde / pierde la mayoría de ellos.

usuario280568
fuente