#c #io #ansi-escape
#c #io #ansi-escape
Вопрос:
У меня возникли проблемы с пониманием того, как read()
и write()
работают в C. Похоже, что код, с которым я работаю, записывает STDOUT_FILENO
и считывает одни и те же данные из STDIN_FILENO
. Мне интересно, должно ли это быть так или нет, поскольку два файловых дескриптора разные.
Я уже просмотрел справочные страницы, и они, похоже, вообще не помогли.
Вот код:
if (write(STDOUT_FILENO, "x1b[6n", 4) != 4) return -1;
printf("rn");
char c;
while (read(STDIN_FILENO, amp;c, 1) == 1) {
if (iscntrl(c)) {
printf("%drn", c);
} else {
printf("%d ('%c')rn", c, c);
}
}
Код выводит escape-последовательность, которая была записана так, как ее форматирует if
statment, что означало, что STDIN_FILENO
каким-то образом считывается вывод STDOUT_FILENO
. Так ли это должно работать, и если да, то почему?
Комментарии:
1. Если они являются концами канала, конечно, но этого фрагмента недостаточно, чтобы сказать.
Ответ №1:
Нет, это делает именно то, что вы просите:
^[[6n
это управляющая последовательность ansi для DSR (отчета о состоянии устройства). Это сообщает текущее положение вашего курсора на ввод вашего терминала (stdin) в формате ^[[r; cr, где «r» и «c» являются «строкой» и «столбцом». Вы можете использовать это для определения местоположения курсора в вашем терминале.
Это особая функция терминала, который понимает и обрабатывает такие управляющие коды, и это не обычное поведение stdin / stdout. Обычно вы не считываете из stdin то, что вы записали в stdout (здесь это также не так, это только выглядит похоже!)
Комментарии:
1. Небольшой вопрос, поэтому «x1b[2J» очищает экран. Это также записывает что-нибудь в stdin, или это просто отличается для каждой escape-последовательности ansi?
2. @Vasting Для каждой escape-команды это по-разному. Только те, которые запрашивают информацию о терминале, будут записывать ответы в stdin.