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 la intr
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 (con tcsetpgrp()
para establecer ese atributo del dispositivo pty) o no.
Por ejemplo, cuando se ejecuta en el indicador de un shell interactivo:
foo | bar
El shell inicia un nuevo grupo de procesos con dos procesos (en el que se ejecuta foo
y bar
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:
foo | bar &
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)?