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

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

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

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

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

16 голосов | спросил calavera.info 10 MarpmFri, 10 Mar 2017 12:58:39 +03002017-03-10T12:58:39+03:0012 2017, 12:58:39

1 ответ


33

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

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

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

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

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

foo | bar

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

В:

foo | bar &

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

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

ответил Stéphane Chazelas 10 MarpmFri, 10 Mar 2017 13:09:45 +03002017-03-10T13:09:45+03:0001 2017, 13:09:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132