Дисциплина линии
Дисциплина линии[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, отправляются в канал ввода консоли. Никакой обработки данных в этом режиме не происходит.
Примечания
- IBM. Подсистема tty. Дисциплины линии . IBM Knowledge Center.
- The TTY demystified
Ссылки
- Модуль дисциплины линии (ldterm)
- Alessandro Rubini. Tour of the Linux kernel source. Reading the console . the Linux Documentation Project. www.tldp.org. Дата обращения: 2 сентября 2016.