Кто решает, какое приложение получает сигнал с клавиатуры?

16

Мое текущее понимание сигналов от клавиатуры в терминале (в значительной степени основанное на попытке сопоставить мои наблюдения с тем, что можно найти в Google) следующее:

  • Пользователь нажимает Cc
  • Это отправляется во входной буфер терминала в виде байта, который вычисляется путем очистки 2 крайних левых битов от 7-битного значения ascii c

После этого он становится действительно туманным, потому что конфигурация, что означает вход, какой сигнал подается на клемму (stty). Я полагаю, это означает, что сам терминал отправляет сигнал процессу. Но я также думаю, что этот терминал не знает о приложении, которое его читает.

Как происходит посылка сигнала с клавиатуры в терминале от начала до конца?

calavera.info
источник
1
Не ответ сам по себе, но стоит прочесть: TTY демистифицирован , lft.
Сумерки

Ответы:

33

Нажатие в Cто время Ctrlкак нажато посылает нажатие клавиши, сопровождаемое событием отпускания клавиши X11, к эмулятору терминала.

После этого события (обычно нажатия клавиши) эмулятор терминала записывает 0x3 byte ( ^C) в свой файловый дескриптор на главной стороне псевдо-tty устройства.

Если isigнастройка termios устройства intrвключена и если настройка установлена ​​на этот байт 0x3, то ядро ​​отправляет сигнал SIGINT всем членам группы процессов переднего плана терминального устройства (еще один атрибут, хранящийся в pty устройстве). В этом случае байт 0x3 не будет доступен для чтения на ведомой стороне pty.

Обычно это интерактивные оболочки, которые создают группы процессов (с setpgid()) для заданий оболочки и решают, какую из них поместить на передний план (с помощью, tcsetpgrp()чтобы установить этот атрибут устройства pty) или нет.

Например, когда вы запускаете по приглашению интерактивной оболочки:

foo | bar

Оболочка запускает новые группы процессов с двумя процессами (в которых она выполняется fooи barпосле подключения их stdin / out к каналу) и помещает эту группу на передний план. Оба процесса получили бы SIGINT, если вы нажали Ctrl-C.

В:

foo | bar &

То же самое, но группа процессов не помещается на передний план (и оболочка также не ждет этого, чтобы вы могли вводить другие команды). Эти процессы не получат SIGINT при Ctrl-C, но могут быть приостановлены, если они попытаются прочитать с устройства tty.

Дополнительная информация: Каковы обязанности каждого компонента псевдотерминала (PTY) (программное обеспечение, ведущая сторона, ведомая сторона)?

Стефан Шазелас
источник
2
Спасибо за богатый ответ. Я попытаюсь перефразировать суть ответа, чтобы быть уверенным, что я его понимаю: сигнал отправляется ядром, которое отслеживает само устройство tty на вход, настроенный в атрибутах устройства (кем бы он ни захотел его настроить) и ядро ​​отправляет его в группу процессов, которая также сконфигурирована в атрибутах устройства (главным образом с помощью оболочки как одна из обязанностей лидера сеанса). Я надеюсь, что это правильно.
calavera.info
1
@ calavera.info, да, это правильно. В случае реального терминала на конце последовательного кабеля ядро ​​ищет этот байт 0x3, поступающий из провода. Для псевдотерминала ведущая сторона заменяет провод. И ядро ​​ищет этот байт 0x3 в байтах, отправленных эмулятором терминала. См. Также правку со ссылкой на другой вопрос и ответ с более подробной информацией (например, тот факт, что обработка ядра является частью модульной конструкции, которая выполняется, когда устройство используется в качестве «терминального» устройства ( дисциплина терминальной линии ).
Стефан Шазелас
Разве вопрос не говорит о терминале , а не об эмуляторе терминала ? Я не думаю, что это имеет большое значение, учитывая, что функция эмулятора состоит в том, чтобы действовать как можно больше как терминал ...
Тоби Спейт
2
@ Да, да, поскольку в наши дни никто не использует настоящий терминал, я предположил, что OP подразумевал эмуляторы терминала (многие из них называются «терминалами»). Смотрите также мой комментарий выше вашего и связанные вопросы и ответы для более подробной информации.
Стефан
1
@TobySpeight Да, я спрашивал о терминале, потому что я имею дело с реальным терминалом по последовательной линии, но ответ и последующие комментарии были полностью действительны для обоих случаев.
calavera.info