Как write () и read() взаимодействуют в C ()?

#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.