Как реализована задержка / заполнение terminfo в TTY?
Я смотрел на terminfo, и у него есть задержки, например $<5>
в строках возможностей. Я пытался увидеть сквозь бег tput
под strace
как реализована задержка, т. е. реализована ли она, скажем, nanosleep
или вставив NUL
или другие персонажи. Это команда, которую я пытался выполнить и отследить:
TERM=ansi77 strace -o log.txt tput dl1
Я выбрал dl1
на ansi77
потому что это определяется как dl1=\E[M$<5*/>
, Тем не менее, все, что я вижу в трассировке, это запись 3 байтов:
write(1, "\33[M", 3) = 3
- Итак, мой вопрос, как на самом деле осуществляется задержка? Заполнение символов или простой процесс / поток сна?
- Могу ли я наблюдать это в эмуляторе терминала или мне нужен настоящий аппаратный терминал, чтобы увидеть это?
- Есть ли какой-либо недостаток в попытке воспроизвести его с
tput
?
2 ответа
Согласившись с @cliffordheath, что заполнение выполняется путем добавления дополнительных символов, может помочь ссылка на доступную документацию.
Аппаратные терминалы не перестали существовать, они все еще поддерживаются ncurses. Без дополнения эти старые терминалы не будут работать должным образом (сброс или искажение вашего вывода). vt100
запись использует заполнение, что для xterm
не.
Имя terminfo для символа заполнения pad
; pc
является именем termcap (см. terminfo (5)):
pad_char pad pc padding char
(instead of null)
Страница руководства terminfo содержит длинный абзац (в разделе "Типы возможностей"), посвященный заполнению. В формате terminfo поддерживаются два типа заполнения (рекомендательный и обязательный), различающиеся по формату. termcap поддерживает только последнее (конечно, с использованием другого синтаксиса), и, в отличие от terminfo, все задержки происходят одновременно (в результате чего escape-последовательности для "flash" обычно не работают).
Командная строка tput
программа делает больше, чем просто обертка для функции tputs
, но он использует это при выводе строк. Программа командной строки обеспечивает вывод логических, числовых и, конечно, строковых возможностей.
Вызов библиотеки tputs
имеет параметр для числа затронутых линий, который учитывается (например, скорость передачи) при задержках вычислений.
В вопросе ОП
dl1=\E[M$<5*/>
задает задержку, пропорциональную количеству затронутых линий (помеченных "*"
персонаж). Количество строк, затронутых для командной строки tput
Утилита 1. Она вызывает putp
сделать это. Однако это, в свою очередь, вызывает delay_output, а это вызывает скорость передачи данных. Последняя функция инициализируется только при инициализации терминала. Командная строка tput
не инициализирует терминал, поэтому задержки не будут работать для этого. Вы должны видеть (учитывая правильную скорость) задержки, используя саму библиотеку.
ncurses также обеспечивает задержки с napms
(миллисекунды), который отличается от заполнения.
Там, где реализованы задержки, это делается путем передачи символов пэда, традиционно NUL-символов. Символ пэда может быть изменен установкой termdata / terminfo переменной pad или pc.
Символы пэда необходимы, потому что программа не может знать, когда на самом деле были написаны ранее отправленные символы, чтобы запустить задержку ЦП. Даже если ядро завершит работу с ними после сброса вывода, символы все равно могут быть помещены в буфер в устройстве вывода UART.
Количество требуемых символов пэда рассчитывается исходя из скорости передачи в бодах, поэтому оно зависит от того, какая информация доступна и точна.
Подпрограмма tputs в библиотеке реализует заполнение (см. Man 3 tputs). Я подозреваю, что инструмент командной строки делает то же самое, так как это в основном просто оболочка.