Chi decide quale applicazione riceve il segnale dalla tastiera?


16

La mia attuale comprensione dei segnali dalla tastiera nel terminale è (in gran parte basata sul tentativo di mappare le mie osservazioni su ciò che può essere trovato su google) di seguito:

  • L'utente preme Cc
  • Questo viene inviato al buffer di input del terminale come un byte che viene calcolato cancellando 2 bit più a sinistra dal valore ASCII 7 bit di c

Dopodiché inizia a diventare davvero nebbioso, perché la configurazione di input indica quale segnale viene eseguito nel terminale (stty). Suppongo significhi che il terminale stesso sta inviando il segnale al processo. Ma ho anche pensato che quel terminale non fosse a conoscenza dell'applicazione che lo sta leggendo.

Come funziona l'invio di un segnale da tastiera nel terminale da un capo all'altro?


1
Non è una risposta a sé stante, ma vale la pena leggerlo: il TTY si è demistificato , a ogni modo.
duskwuff,

Risposte:


33

Premendo Cmentre Ctrlviene premuto viene inviato un tasto premuto seguito dall'evento X11 di rilascio dei tasti all'emulatore di terminale.

Su quell'evento (generalmente quello di pressione dei tasti), l'emulatore di terminale scrive lo 0x3 byte ( ^C) nel suo descrittore di file sul lato principale del dispositivo pseudo-tty.

Se l' isigimpostazione termios del dispositivo è attiva e se l' intrimpostazione è su quel byte 0x3, il kernel invia il segnale SIGINT a tutti i membri del gruppo di processo in primo piano del dispositivo terminale (un altro attributo memorizzato nel dispositivo pty). In tal caso, il byte 0x3 non sarà disponibile per la lettura sul lato slave del pty.

Di solito sono shell interattive che creano gruppi di processi (con setpgid()) per processi shell e decidono quale mettere in primo piano (con cui tcsetpgrp()impostare quell'attributo del dispositivo pty) oppure no.

Ad esempio quando si esegue al prompt di una shell interattiva:

foo | bar

La shell avvia un nuovo gruppo di processi con due processi (in cui viene eseguita fooe bardopo aver collegato il loro stdin / out con una pipe) e mette quel gruppo in primo piano. Entrambi i processi riceveranno SIGINT se si preme Ctrl-C.

Nel:

foo | bar &

Lo stesso, ma il gruppo di processi non viene messo in primo piano (e anche la shell non lo aspetta, quindi è possibile inserire altri comandi). Questi processi non ottengono il SIGINT su Ctrl-C ma potrebbero essere sospesi se provano a leggere dal dispositivo tty.

Altre informazioni su: Quali sono le responsabilità di ciascun componente Pseudo-Terminale (PTY) (software, lato master, lato slave)?


2
Grazie per la ricca risposta. Proverò a riformulare il nocciolo della risposta per essere sicuro di averlo capito: il segnale viene inviato dal kernel, che sta monitorando il dispositivo tty stesso per input configurato negli attributi del dispositivo (da chiunque voglia configurarlo) e il kernel lo invia al gruppo di processo che è anche configurato negli attributi del dispositivo (principalmente dalla shell come uno dei compiti di un leader della sessione). Spero sia corretto
calavera.info,

1
@ calavera.info, sì, è corretto. Nel caso di un terminale reale alla fine di un cavo seriale, il kernel sta cercando quel byte 0x3 proveniente dal filo. Per uno pseudo-terminale, il lato master sostituisce il filo. E il kernel sta cercando quel byte 0x3 nei byte inviati dall'emulatore di terminale. Vedi anche la modifica con un link ad un'altra domanda e risposta con maggiori dettagli (come il fatto che l'elaborazione del kernel fa parte di un design modulare che viene fatto quando il dispositivo viene utilizzato come dispositivo "terminale" ( disciplina della linea terminale ).
Stéphane Chazelas

La domanda non diceva terminale , piuttosto che emulatore di terminale ? Suppongo che non faccia molta differenza, dato che la funzione dell'emulatore è quella di agire il più possibile come un terminale ...
Toby Speight

2
@Toby, sì, dato che al giorno d'oggi quasi nessuno usa un terminale reale, ho assunto che OP intendesse emulatori di terminali (molti di loro sono chiamati "terminali"). Vedi anche il mio commento sopra il tuo e le domande e risposte collegate per maggiori dettagli.
Stéphane Chazelas,

1
@TobySpeight Sì, stavo chiedendo un terminale perché ho a che fare con il terminale reale su linea seriale, ma la risposta e i seguenti commenti erano completamente validi per entrambi i casi.
calavera.info,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.