Хто вирішує, яка програма отримує сигнал з клавіатури?


16

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

  • Користувач натискає Cc
  • Це направляється на вхідний буфер терміналу як байт, який обчислюється за допомогою очищення 2 самих лівих бітів від 7-бітного значення ascii c

Після цього він починає бути по-справжньому туманним, оскільки конфігурація того, що вводить сигнал, який сигнал робиться в терміналі (stty). Я думаю, це означає, що термінал сам посилає сигнал в процес. Але я також, хоча цей термінал не знає про програму, яка його читає.

Як передача сигналу клавіатурою в терміналі працює від кінця до кінця?


1
Не відповідь самостійно, але варто прочитати: TTY демістифікований lft.
duskwuff -inactive-

Відповіді:


33

Натискання Cпри Ctrlнатисканні надсилає натискання клавіші, а потім подія звільнення клавіші X11 на емулятор терміналу.

Після цієї події (як правило, натискання клавіші) емулятор термінала записує 0x3 байт ( ^C) у свій дескриптор файлів на головній частині псевдо-tty пристрою.

Якщо 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.

Детальніше читайте на тему : Які обов'язки кожного компонента псевдо-терміналу (PTY) (програмне забезпечення, майстер, підлеглий)?


2
Дякую за багату відповідь. Я спробую перефразувати ядро ​​відповіді, щоб бути впевненим, що я це розумію: Сигнал надсилається ядром, яке контролює сам пристрій tty для введення, налаштованого в атрибутах пристрою (тим, хто хоче його налаштувати) і ядро ​​відправляє його до групи обробки, яка також налаштована в атрибутах пристрою (головним чином по оболонці як одне із обов'язків лідера сеансу). Я сподіваюся, що це правильно.
calavera.info

1
@ calavera.info, так, це правильно. У разі реального терміналу в кінці послідовного кабелю ядро ​​шукає байт 0x3, що надходить з дроту. Для псевдотерміналу головна сторона замінює провід. І ядро ​​шукає цей байт 0x3 у байтах, надісланих туди емулятором терміналу. Дивіться також редагування із посиланням на інший Q&A з більш детальною інформацією (на кшталт того, що обробка ядра є частиною модульної конструкції, яка робиться, коли пристрій використовується як "термінальний" пристрій (термінальна лінія дисципліни ).
Stéphane Chazelas

Чи не в питанні було сказано термінал , а не емулятор терміналу ? Я не думаю, що це має велике значення, враховуючи, що функція емулятора - діяти якомога більше, як термінал ...
Toby Speight,

2
@ Так, так, оскільки навряд чи хтось використовує справжній термінал в наші дні, я припускав, що ОП означав емулятори терміналів (багато з них називаються "термінальними"). Дивіться також мій коментар вище вашого та пов'язані запитання та відповіді для отримання більш детальної інформації.
Стефан Шазелас

1
@TobySpeight Так, я питав про термінал, оскільки я маю справу з реальним терміналом через послідовну лінію, але відповідь та наступні коментарі цілком справедливі для обох випадків.
calavera.info
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.