Как и когда преобразуется комбинация клавиш прерывания, например CTRL-C, в сигналы? - PullRequest
0 голосов
/ 08 мая 2019

Используя ОС Linux, мне нужно прозрачно передавать все нажатия клавиш от удаленных подключений к локальным аппаратным подключениям.Это довольно просто для всего, кроме сигналов.Я знаю, что могу зарегистрировать обработчики для каждого сигнала, который захватывает и передает нажатие клавиши, но это похоже на хак, который может не сработать для крайних случаев (что, если кто-то изменит комбинированное отображение ключа прерывания, я бы дважды передавал нажатия клавиш и т. Д.).

Чтобы найти лучшее решение, мне действительно нужно больше узнать о том, как комбинации клавиш, IE: CTRL-C, становятся сигналами, IE: SIGINT.

  1. Как комбинация клавиш становится сигналом (в ядре, клиентском приложении, во время выполнения)?
  2. Продолжается ли нажатие клавиши?Если CTRL-C имеет нулевой обработчик, STDIN все еще получает CTRL-C?
  3. Каков наилучший способ не интерпретировать какое-либо нажатие клавиши как комбинацию сигналов?Это можно сделать в настройках TTY или Environment?

Ответы [ 2 ]

3 голосов
/ 08 мая 2019
  1. Комбинация клавиш превращается в сигнал линейной дисциплины терминала *1003*, уровня в подсистеме TTY.Вот описание из Википедии :

Например, стандартная дисциплина линии обрабатывает данные, которые она получает от аппаратного драйвера и от приложений, записывающих на устройство, в соответствии стребования терминала в Unix-подобной системе.При вводе он обрабатывает специальные символы, такие как символ прерывания (обычно Control-C) и символы стирания и уничтожения (обычно backspace или delete и Control-U соответственно), а при выводе заменяет все символы LF наCR / LF последовательность.

Нажатие клавиши не пропущено, оно подавляется при повышении сигнала.Если у процесса нет обработчика SIGINT, ядро ​​завершит его.

Очевидно, вы можете переопределить это: так работают такие инструменты, как ssh.Вы можете легко сделать это, установив терминал в «сырой» режим, например, с помощью команды оболочки stty raw.Если вы затем наберете cat -vE, вы можете нажать любые клавиши и увидеть их напечатанными в виде каретки.Обязательно планируйте способ закрытия терминала, потому что вы, очевидно, больше не можете использовать Ctrl-C / Z / D.

1 голос
/ 08 мая 2019

Как комбинация клавиш становится сигналом (в ядре, клиентском приложении, во время выполнения)?

Этот перевод выполняется как часть дисциплины линии TTY ядра . Существует ряд других переводов, выполняемых в рамках этого процесса, таких как конец файла (^ D), сигнализация остановки (^ Z), символьное эхо, редактирование базовой строки (backspace, ^ U и т. Д.) И DEL / Перевод BS и CR / CRLF.

Нажатие клавиши все еще прошло? Если CTRL-C имеет нулевой обработчик, STDIN все еще получает CTRL-C?

Нет. Управляющие символы, которые обрабатываются дисциплиной строки, не передаются на передний план процесса.

Как лучше всего не интерпретировать нажатие клавиш как комбинацию сигналов? Это можно сделать в настройках TTY или Environment?

Используйте tcgetattr() и tcsetattr() для изменения атрибутов терминала. Элемент c_cc в struct termios содержит настройки для управляющих символов; Вы можете отключить некоторые или все элементы, установив их на _POSIX_VDISABLE.

(Вы также можете использовать cfmakeraw() - задокументировано на той же странице, что и выше - для очистки большинства элементов struct termios, что дает вам в основном «сырой» терминал. Однако, это может отключить больше режимов работы терминала, чем вы ожидаете.)

...