Мое текущее понимание сигналов от клавиатуры в терминале (в значительной степени основанное на попытке сопоставить мои наблюдения с тем, что можно найти в Google) следующее:
- Пользователь нажимает Cc
- Это отправляется во входной буфер терминала в виде байта, который вычисляется путем очистки 2 крайних левых битов от 7-битного значения ascii c
После этого он становится действительно туманным, потому что конфигурация, что означает вход, какой сигнал подается на клемму (stty). Я полагаю, это означает, что сам терминал отправляет сигнал процессу. Но я также думаю, что этот терминал не знает о приложении, которое его читает.
Как происходит посылка сигнала с клавиатуры в терминале от начала до конца?
Ответы:
Нажатие в Cто время Ctrlкак нажато посылает нажатие клавиши, сопровождаемое событием отпускания клавиши X11, к эмулятору терминала.
После этого события (обычно нажатия клавиши) эмулятор терминала записывает 0x3 byte (
^C
) в свой файловый дескриптор на главной стороне псевдо-tty устройства.Если
isig
настройка termios устройстваintr
включена и если настройка установлена на этот байт 0x3, то ядро отправляет сигнал SIGINT всем членам группы процессов переднего плана терминального устройства (еще один атрибут, хранящийся в pty устройстве). В этом случае байт 0x3 не будет доступен для чтения на ведомой стороне pty.Обычно это интерактивные оболочки, которые создают группы процессов (с
setpgid()
) для заданий оболочки и решают, какую из них поместить на передний план (с помощью,tcsetpgrp()
чтобы установить этот атрибут устройства pty) или нет.Например, когда вы запускаете по приглашению интерактивной оболочки:
Оболочка запускает новые группы процессов с двумя процессами (в которых она выполняется
foo
иbar
после подключения их stdin / out к каналу) и помещает эту группу на передний план. Оба процесса получили бы SIGINT, если вы нажали Ctrl-C.В:
То же самое, но группа процессов не помещается на передний план (и оболочка также не ждет этого, чтобы вы могли вводить другие команды). Эти процессы не получат SIGINT при Ctrl-C, но могут быть приостановлены, если они попытаются прочитать с устройства tty.
Дополнительная информация: Каковы обязанности каждого компонента псевдотерминала (PTY) (программное обеспечение, ведущая сторона, ведомая сторона)?
источник