Я смотрел 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
  1. Итак, мой вопрос: как на самом деле реализована задержка? Заполнение символов или простой процесс / спящий поток?
  2. Могу ли я наблюдать это в эмуляторе терминала или мне нужен настоящий аппаратный терминал, чтобы увидеть это?
  3. Есть ли какой-нибудь недостаток в попытке воспроизвести его с помощью tput?
1
wilx 27 Окт 2015 в 16:59

2 ответа

Лучший ответ

Согласившись с @cliffordheath, что заполнение выполняется путем добавления символов заполнения, может помочь ссылка на доступную документацию.

Аппаратные терминалы не прекратили свое существование, они все еще поддерживаются ncurses. Без заполнения эти старые терминалы не работали бы должным образом (отбрасывание или искажение вывода). Запись vt100 использует заполнение, а запись xterm - нет.

Имя terminfo для символа заполнения - pad ; pc - имя termcap (см. terminfo (5)):

   pad_char                  pad    pc   padding char
                                         (instead of null)

На странице руководства terminfo есть длинный абзац (в < em> Типы возможностей ) для заполнения. В формате terminfo поддерживаются два типа заполнения ( рекомендательный и обязательный ), различающиеся по формату. termcap поддерживает только последнее (конечно, с использованием другого синтаксиса), и, в отличие от terminfo, все задержки происходят одновременно (выполнение escape-последовательностей для «flash» обычно не работает).

Программа командной строки tput не просто выполняет роль оболочка для функции tputs , но он использует это при выводе строк. Программа командной строки обеспечивает вывод логических, числовых и, конечно, строковых возможностей.

Вызов библиотеки tputs имеет параметр для количества затронутых строк, который учитывается (например, скорость передачи) при вычислении задержек.

В вопросе OP

dl1=\E[M$<5*/>

Задает задержку, пропорциональную количеству затронутых строк (помеченных символом "*"). Число затронутых строк для утилиты командной строки tput равно 1. Она вызывает putp для этого. Однако это, в свою очередь, вызывает delay_output, а это вызывает скорость передачи. Последняя функция инициализируется только при инициализации терминала. Командная строка tput не инициализирует терминал, поэтому задержки не будут работать для этого . Вы должны увидеть (при правильной скорости) задержки при использовании самой библиотеки.

Ncurses также предоставляет временные задержки с помощью napms (миллисекунды), что отличается от заполнения.

1
Thomas Dickey 29 Окт 2015 в 00:47

Там, где реализованы задержки, это делается путем передачи символов заполнения, традиционно символов NUL. Символ заполнения можно изменить с помощью параметра termdata / terminfo переменной pad или pc .

Добавочные символы необходимы, потому что программа не может знать, когда фактически были записаны ранее отправленные символы, чтобы запустить задержку CPU. Даже если ядро ​​завершило работу с ними после сброса вывода, символы все равно могут буферизоваться в UART устройства вывода.

Количество требуемых символов клавиатуры рассчитывается на основе скорости передачи, поэтому это зависит от доступности и точности этой информации.

Подпрограмма tputs в библиотеке реализует заполнение (см. man 3 tputs ). Я подозреваю, что инструмент командной строки тоже работает, поскольку в основном это просто оболочка.

2
cliffordheath 28 Окт 2015 в 00:46