VT100 이스케이프 코드 및 TTY 상호 작용: stdin/stdout을 사용하는 대신 TTY 장치를 "열어야" 하는 이유

VT100 이스케이프 코드 및 TTY 상호 작용: stdin/stdout을 사용하는 대신 TTY 장치를 "열어야" 하는 이유

이스케이프 코드를 살펴보고 현재 커서 위치를 읽는 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이는 그 자체로 제공되며 여기서는 어느 정도의 간접적인 지시가 필요하지 않습니다.

관련 정보