¿Quién decide qué aplicación recibe la señal del teclado?

16

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?

calavera.info
fuente
1
No es una respuesta en sí misma, pero vale la pena leerla: el TTY desmitificado , por izquierda.
duskwuff

Respuestas:

33

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 isigconfiguración de termios del dispositivo está activada y si la intrconfiguració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 fooy bardespué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)?

Stéphane Chazelas
fuente
2
Gracias por la rica respuesta. Trataré de reformular el núcleo de la respuesta para asegurarme de que lo entiendo: la señal es enviada por el núcleo, que está monitoreando el dispositivo tty en sí para la entrada que está configurada en los atributos del dispositivo (por quien quiera configurarlo) y el núcleo lo envía al grupo de proceso que también está configurado en los atributos del dispositivo (principalmente por shell como una de las tareas de un líder de sesión). Espero que esto sea correcto.
calavera.info
1
@ calavera.info, sí, eso es correcto. En el caso de un terminal real al final de un cable serie, el núcleo está buscando ese byte 0x3 que proviene del cable. Para un pseudo-terminal, el lado maestro reemplaza el cable. Y el kernel está buscando ese byte 0x3 en los bytes enviados allí por el emulador de terminal. Vea también la edición con un enlace a otras preguntas y respuestas con más detalles (como el hecho de que el procesamiento del núcleo es parte de un diseño modular que se realiza cuando el dispositivo se usa como un dispositivo "terminal" ( disciplina de línea terminal )
Stéphane Chazelas
¿La pregunta no decía terminal , en lugar de emulador de terminal ? Supongo que no hace mucha diferencia, dado que la función del emulador es actuar como un terminal lo más posible ...
Toby Speight
2
@Toby, sí, dado que casi nadie usa un terminal real en estos días, supuse que OP significaba emuladores de terminal (muchos de ellos se llaman "terminal"). Consulte también mi comentario sobre el suyo y las preguntas y respuestas vinculadas para obtener más detalles.
Stéphane Chazelas
1
@TobySpeight Sí, estaba preguntando sobre un terminal porque estoy tratando con el terminal real a través de la línea serial, pero la respuesta y los siguientes comentarios fueron completamente válidos para ambos casos.
calavera.info