VT100 转义码和 TTY 交互:为什么“打开”TTY 设备而不是使用 stdin/stdout

VT100 转义码和 TTY 交互:为什么“打开”TTY 设备而不是使用 stdin/stdout

我查看了转义码,发现了一些读取当前光标位置的 C 代码。我想我现在偶然发现了一个 UNIX/POSIX 编程主题,我之前还没有太多接触过。

下面的代码dev/tty以读写模式打开,并将适当的转义代码写入文件描述符,然后通过从文件描述符读取来接收答案。所以以编程方式我明白发生了什么。

从概念上讲我想知道

  1. 为什么打开 TTY 设备(而不是使用 stdin/stdout)
  2. 如果我打开一个 TTY 设备,我是否必须首先找出当前的 tty(例如,通过打开一个管道/usr/bin/tty,然后打开该设备)。
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void) {
  int tty_fd = open("/dev/tty", O_RDWR);
  if (tty_fd < 0) {
    printf("Cannot open /devv/tty: errno = %d, %s\r\n", errno, strerror(errno));
    exit(EXIT_FAILURE);
  }

  write(tty_fd, "\x1B[6n\n", 5);

  unsigned char res[16] = {0};
  size_t j = 0;
  for (j = 0; j < sizeof(res) - 1 && read(tty_fd, res + j, 1) == 1; j++) {
    printf("%d\n", res[j]);
    if (res[j] == 'R') {
      break;
      res[j] = '\0';
    }
  }

  printf("Answerback = %s", res + 1);

  return 0;
}

答案1

  1. 打开和使用/dev/tty可确保进程有一个控制终端,而这就是转义码实际所在的位置。写入标准输出和从标准输入读取会受到任何重定向(如果有)的影响。

    事实上,运行示例程序并将其输出重定向到文件将导致输出进入该文件,但从终端读取光标位置(如果有的话)。

  2. /dev/tty始终是当前进程的控制终端(如果有的话)。看我当前的控制终端和`/dev/tty`之间有什么关系?了解详情。/dev/tty这本身就提供了,这里不需要一定程度的间接。

相关内容