Как write () и read () взаимодействуют в C ()? - PullRequest
2 голосов
/ 01 апреля 2019

У меня проблемы с пониманием того, как read() и write() работают в C. Кажется, код, с которым я работаю, пишет в STDOUT_FILENO и читает те же данные из STDIN_FILENO.Мне интересно, если это так или нет, так как два дескриптора файла разные.

Я уже просмотрел справочные страницы, и они, похоже, совсем не помогли.

Вот код:

if (write(STDOUT_FILENO, "\x1b[6n", 4) != 4) return -1;
printf("\r\n");
char c;
while (read(STDIN_FILENO, &c, 1) == 1) {
  if (iscntrl(c)) {
    printf("%d\r\n", c);
  } else {
    printf("%d ('%c')\r\n", c, c);
  }
}

Код выводит escapeпоследовательность, которая была записана так, как ее форматирует if, что означало, что STDIN_FILENO каким-то образом считывает вывод STDOUT_FILENO.Так должно работать, и если да, то почему?

1 Ответ

2 голосов
/ 01 апреля 2019

Нет, он делает именно то, что вы просите:

^[[6n - аварийная последовательность ANSI для DSR (отчет о состоянии устройства). Это сообщает текущую позицию вашего курсора на вход вашего терминала (stdin) в формате ^ [[r; cR, где «r» и «c» - «строка» и «столбец». Вы можете использовать это, чтобы определить местоположение курсора в вашем терминале.

Это специальная функция терминала , которая понимает и обрабатывает такие управляющие коды, а не является обычным поведением stdin / stdout. Обычно вы не читаете из stdin то, что вы написали в stdout (здесь это также не так, выглядит только похоже!)

...