Список сгенерированных терминалом сигналов (например, Ctrl-C -> SIGINT)

31

Где я могу найти полный список комбинаций клавиш, которые посылают сигналы в Linux?

Например:

  • Ctrl+ C- SIGINT
  • Ctrl+ \- SIGQUIT
Том Хейл
источник
2
«Клавиатура» не посылает никаких сигналов, дисциплина линии делает. Узнайте, что такое дисциплина, затем прочитайте man 1 stty.
Satō
@SatoKatsura Линейная дисциплина является своего рода драйвером клавиатуры.
Жиль "ТАК - прекрати быть злым"
@ Жиль Не совсем. Драйвер клавиатуры работает со скан-кодами и тому подобным. Дисциплина линии - это своего рода клей более высокого уровня, который дает приложению единое представление о многих других вещах, таких как модемные линии, адаптеры USB-to-serial, устройства HID и т. Д.
Satō
@SatoKatsura Это часть операционной системы, которая находится между приложением и клавиатурой. Другими словами, это часть драйвера клавиатуры. С аппаратным терминалом (например, vt100) это единственное преобразование ввода с клавиатуры, которое выполняется компьютером, в отличие от самого терминала.
Жиль "ТАК - перестань быть злым"

Ответы:

27

Линейная дисциплина Linux N_TTY посылает только три разных сигнала: SIGINT, SIGQUIT и SIGTSTP. По умолчанию следующие управляющие символы генерируют сигналы:

  • Ctrl+ C- SIGINT
  • Ctrl+ \- SIGQUIT
  • Ctrl+ Z- СИГЦТП
Йохан Мирен
источник
Хм, а как насчет Ctrl-S и Ctrl-Q? У вас есть ссылка на это?
Том Хейл,
6
При нажатии Ctrl-S или Ctrl-Q сигналы не включаются. Они просто душат поток персонажей, не позволяя им достичь процесса потребления. В конце концов, когда буферы заполняются, производящий процесс блокирует системный вызов write до тех пор, пока Ctrl-Q не сгладит поток. Обратите внимание, что это нормально для вызова для записи может блокировать даже без Ctrl-S: если процесс приема медленный, чтобы потреблять отправленные ему данные, например, потому что он тратит большую часть своего времени на обработку уже полученных данных вместо чтения новых данных ,
Йохан Мирен
1
man stty | grep -C1 signalодин источник для этих трех, являющихся единственными сигналами, генерируемыми терминалом.
Том Хейл,
@TomHale ... Кроме "сигналов управления модемом" есть электрические сигналы. :) На самом деле, SIGINT, SIGQUITи SIGTSTPявляются только «обычные» сигналы , передаваемые по линии дисциплины. На BSD у вас тоже есть такие вещи SIGINFO, но это не стандартно.
Satō
8

Вы можете использовать sttyдля проверки или изменения символов, которые генерируют сигналы.

$ stty -a | grep -Ewoe '(intr|quit|susp) = [^;]+'
intr = ^C
quit = ^\
susp = ^Z

intr(прерывание) генерирует SIGINT, quitгенерирует SIGQUIT, susp(приостановить) генерирует SIGTSTP. stty -aтакже покажет такие вещи, как start = ^Q; stop = ^S;и erase = ^?(возврат), которые не отправляют сигналы, но влияют на уровень терминала в противном случае.

Обычный sttyпокажет нестандартные настройки и, например stty intr ^Q, изменит символ прерывания на ^Qвместо ^C.

Я думаю ^L(подача формы, новая страница) - это не терминальная функция, а символ, часто используемый приложениями для запроса перерисовки представления, одновременно перепроверяя размер окна.

ilkkachu
источник
1
^Lимеет разное значение для разных приложений. В большинстве curses-приложений (такие , как vim, less, mutt, mcи т.д.) заставляет полную перерисовку (таким образом , повторно проверив размер окна), но в раковинах ( и bashт.д.) он просто очищает экран. Там не SIGWINCHучаствует.
Satō