Mi comprensión actual de las señales del teclado en la terminal es (basada en gran medida en tratar de asignar mis observaciones a lo que se puede encontrar en Google) a continuación:
- El usuario presiona Cc
- Esto se envía al búfer de entrada del terminal como un byte que se calcula borrando 2 bits más a la izquierda del valor ascii de 7 bits de c
Después de esto, comienza a ser muy brumoso, porque la configuración de qué entrada significa qué señal se realiza en el terminal (stty). Supongo que significa que el terminal está enviando la señal al proceso. Pero también pensé que ese terminal no sabe acerca de la aplicación que lo está leyendo.
¿Cómo funciona el envío de una señal por teclado en la terminal de extremo a extremo?
Respuestas:
Presionar Cmientras Ctrlse presiona envía una pulsación de tecla seguida del evento X11 de liberación de tecla al emulador de terminal.
Ante ese evento (generalmente el que se presiona una tecla), el emulador de terminal escribe el byte 0x3 (
^C
) en su descriptor de archivo en el lado maestro del dispositivo pseudo-tty.Si la
isig
configuración de termios del dispositivo está activada y si laintr
configuración se establece en ese byte 0x3, el núcleo envía la señal SIGINT a todos los miembros del grupo de procesos en primer plano del dispositivo terminal (otro atributo almacenado en el dispositivo pty). En ese caso, el byte 0x3 no estará disponible para leer en el lado esclavo de la pty.Por lo general, son shells interactivos que crean grupos de procesos (con
setpgid()
) para trabajos de shell y deciden cuál poner en primer plano (contcsetpgrp()
para establecer ese atributo del dispositivo pty) o no.Por ejemplo, cuando se ejecuta en el indicador de un shell interactivo:
El shell inicia un nuevo grupo de procesos con dos procesos (en el que se ejecuta
foo
ybar
después de haber conectado su stdin / out con una tubería) y pone ese grupo en primer plano. Ambos procesos recibirían el SIGINT si presionaras Ctrl-C.En:
Lo mismo, pero el grupo de proceso no se pone en primer plano (y el shell tampoco lo espera para que pueda ingresar otros comandos). Esos procesos no obtendrían el SIGINT en Ctrl-C, pero podrían suspenderse si intentan leer desde el dispositivo tty.
Más información en: ¿Cuáles son las responsabilidades de cada componente Pseudo-Terminal (PTY) (software, lado maestro, lado esclavo)?
fuente