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?
Odpowiedzi:
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
isig
ustawienie termios urządzenia jest włączone, aintr
ustawienie 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:
Powłoka uruchamia nowe grupy procesów z dwoma procesami (w których wykonuje się
foo
ibar
po 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:
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)?
źródło