Дисциплина линии

Дисциплина линии[1] (англ. line discipline, ldisc) — это слой абстракции подсистемы терминальных устройств (tty) UNIX-подобных операционных систем, необходимый для имитации соответствующих возможностей аппаратного терминала. Этот слой расположен между драйвером консоли и драйвером UART[2].

Соединение с драйвером UART осуществляется через двунаправленный канал. Эта схема имеет несколько вариаций. Например, в качестве драйвера UART может выступать виртуальное устройство телетайпа /dev/tty — в этом случае с имеющимся виртуальным терминалом могут работать процессы на локальной машине. Если же работа осуществляется через физический UART, то такая схема обеспечивает связь с процессом на удалённой рабочей станции, то есть режим удалённого терминала.

Соединение с консолью осуществляется через два однонаправленных канала: канал ввода и канал вывода. Здесь тоже возможны вариации. Если в качестве консоли используется драйвер виртуального терминала UNIX, то, через такую виртуальную консоль пользователь может работать в UNIX-системе в полноэкранном текстовом режиме, переключаясь между консолями при помощи горячих клавиш. Вместо драйвера консоли, интерфейс ldisc может экспортироваться через файл устройства, такой, как, например, /dev/ttyS0. В этом случае, с ldisc может взаимодействовать коммуникационная программа, такая, как minicom

Существует так же схема подключения ldisc, при которой файлами виртуальных устройств заменяется как консоль, так и UART. Такая схема получила название псевдо-терминала. В этом случае ведущее устройство (master), такое, как /dev/ptyp1, заменяет консоль и используется специализированной программой, такой как tmux, xterm или socat. Подчинённое (slave) устройство, такое, как /dev/ttyp1, заменяет UART и может использоваться любым пользовательским процессом.

Модуль дисциплины линии предоставляет буфер для приёма строки из канала вывода консоли, обрабатывает управляющие символы редактирования строки (не путать с управляющими последовательностями терминала), а также обеспечивает реализацию механизма эхо — отправляет принятые с консоли символы обратно, через канал ввода консоли. После обработки, строка из буфера отправляется в канал UART. Принятые из канала UART данные, после обработки, отправляются в канал ввода консоли.

Именно слой ldisc определяет работу таких системных вызовов, как read(2) и write(2) при работе с различными файлами устройств терминала. Управлять им можно с помощью системного вызова ioctl(2) (или же посредством библиотечной функции-обёртки tcsetattr(3)), в том случае, если хотя бы один из сопряжённых с ним компонентов экспортируется через файл устройств. При этом, какой именно компонент экспортирован, значения не имеет — управление можно осуществлять как через устройство master, так и через slave. Например, используя файл-устройство /dev/tty (соответствует подчинённой стороне), можно управлять режимом эхо консоли, а, используя файл-устройство /dev/ttyS0 (соответствует ведущей стороне), можно управлять режимом эхо для самой коммуникационной программы: при включённом эхо, всё, записанное в /dev/ttyS0, можно будет сразу считать назад.

Если программа использует собственную обработку строк, например, при помощи библиотеки Ncurses или Readline, то механизм обработки строк, предоставляемый подсистемой терминальных устройств, можно отключить, переведя ldisc в режим raw. В этом режиме, данные, принимаемые из канала вывода консоли, отправляются в канал UART, а данные, принятые с UART, отправляются в канал ввода консоли. Никакой обработки данных в этом режиме не происходит.

Примечания

  1. IBM. Подсистема tty. Дисциплины линии. IBM Knowledge Center.
  2. The TTY demystified

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.