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これはそれ自体で提供され、ここではある程度の間接的な指示は必要ありません。

関連情報