Kto decyduje, która aplikacja odbiera sygnał z klawiatury?

16

Moje obecne rozumienie sygnałów z klawiatury w terminalu (oparte w dużej mierze na próbie mapowania moich obserwacji na to, co można znaleźć w Google):

  • Użytkownik naciska Cc
  • Jest on wysyłany do bufora wejściowego terminala jako bajt, który jest obliczany przez skasowanie 2 najbardziej wysuniętych w lewo bitów z 7 bitowej wartości ascii c

Po tym zaczyna być naprawdę mglisty, ponieważ konfiguracja, co oznacza, jaki sygnał jest wykonywany w terminalu (stty). Podejrzewam, że oznacza to, że sam terminal wysyła sygnał do procesu. Ale pomyślałem też, że ten terminal nie wie o aplikacji, która go czyta.

Jak działa wysyłanie sygnału za pomocą klawiatury w terminalu od końca do końca?

calavera.info
źródło
1
Nie jest to odpowiedź sama w sobie, ale warta przeczytania: TTY zdemistyfikowany przez lft.
duskwuff -inactive-

Odpowiedzi:

33

Naciśnięcie, Cgdy Ctrljest naciśnięty, wysyła naciśnięcie klawisza, a następnie zdarzenie X11 wydania klucza do emulatora terminala.

Po tym zdarzeniu (zwykle naciśnięcie klawisza) emulator terminala zapisuje bajt 0x3 ( ^C) do swojego deskryptora pliku po stronie master urządzenia pseudo-tty.

Jeśli isigustawienie termios urządzenia jest włączone, a intrustawienie to bajt 0x3, wówczas jądro wysyła sygnał SIGINT do wszystkich członków pierwszoplanowej grupy procesów urządzenia końcowego (inny atrybut przechowywany w urządzeniu pty). W takim przypadku bajt 0x3 nie będzie dostępny do odczytu po stronie slave pty.

Zwykle są to interaktywne powłoki, które tworzą grupy procesów (z setpgid()) dla zadań powłoki i decydują, który z nich umieścić na pierwszym planie (z, tcsetpgrp()aby ustawić ten atrybut urządzenia pty), czy nie.

Na przykład, gdy uruchamiasz się po znaku zachęty interaktywnej powłoki:

foo | bar

Powłoka uruchamia nowe grupy procesów z dwoma procesami (w których wykonuje się fooi barpo podłączeniu stdin / out za pomocą potoku) i umieszcza tę grupę na pierwszym planie. Oba procesy otrzymałyby SIGINT, jeśli naciśniesz Ctrl-C.

W:

foo | bar &

To samo, ale grupa procesów nie jest umieszczana na pierwszym planie (a powłoka również nie czeka na nią, aby można było wprowadzić inne polecenia). Te procesy nie otrzymałyby SIGINT po Ctrl-C, ale mogłyby zostać zawieszone, gdyby próbowały czytać z urządzenia tty.

Więcej informacji na: Jakie są obowiązki każdego komponentu Pseudo-Terminal (PTY) (oprogramowanie, strona master, strona slave)?

Stéphane Chazelas
źródło
2
Dzięki za bogatą odpowiedź. Spróbuję przeformułować rdzeń odpowiedzi, aby upewnić się, że rozumiem: sygnał jest wysyłany przez jądro, które monitoruje samo urządzenie tty pod kątem danych wejściowych skonfigurowanych w atrybutach urządzenia (przez każdego, kto chce je skonfigurować) a jądro wysyła je do grupy procesów, która jest również skonfigurowana w atrybutach urządzenia (głównie przez powłokę jako jeden z obowiązków lidera sesji). Mam nadzieję, że to prawda.
calavera.info,
1
@ calavera.info, tak, to prawda. W przypadku prawdziwego terminala na końcu kabla szeregowego jądro szuka bajtu 0x3 pochodzącego z drutu. W przypadku pseudoterminalu strona główna zastępuje przewód. Jądro szuka bajtu 0x3 w bajtach wysłanych tam przez emulator terminala. Zobacz także edycję z linkiem do innego pytania i odpowiedzi z dodatkowymi szczegółami (np. Fakt, że przetwarzanie jądra jest częścią modułowej konstrukcji, która jest wykonywana, gdy urządzenie jest używane jako urządzenie „terminalowe” ( dyscyplina linii terminalowej ).
Stéphane Chazelas
Czy pytanie nie brzmiało terminal , a nie emulator terminala ? Nie sądzę, że robi to dużą różnicę, biorąc pod uwagę, że funkcją emulatora jest zachowanie jak największej liczby terminali ...
Toby Speight
2
@Toby, tak, ponieważ prawie nikt obecnie nie używa prawdziwego terminalu, założyłem, że OP oznacza emulatory terminali (wiele z nich nazywa się „terminalami”). Zobacz także mój komentarz powyżej twojego i powiązane pytania i odpowiedzi, aby uzyskać więcej informacji.
Stéphane Chazelas,
1
@TobySpeight Tak, pytałem o terminal, ponieważ mam do czynienia z prawdziwym terminalem przez linię szeregową, ale odpowiedź i następujące komentarze były całkowicie poprawne w obu przypadkach.
calavera.info,