あるファイルディスクリプタでtty設定を変更すると、他のファイルディスクリプタに影響するのはなぜですか?

あるファイルディスクリプタでtty設定を変更すると、他のファイルディスクリプタに影響するのはなぜですか?

ECHOデフォルトでは、stdinとstdoutでは設定が有効になっています。しかし、なぜstdinを無効にするとECHOstdinでも無効になるのでしょうかstdout?彼らは2つの別々の記述子を持っていますが01なぜ彼らは同じファイル記述子が同じであるかのように同時に変更されますか?

次のプログラムはこれを示しています。

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

int main(void)
{
  struct termios tty_stdin;
  struct termios tty_stdin_restore;
  struct termios tty_stdout;
  tcgetattr(STDIN_FILENO, &tty_stdin);
  tcgetattr(STDIN_FILENO, &tty_stdin_restore);

  /* disable echo on stdin */
  tty_stdin.c_lflag &= (tcflag_t) ~ECHO;
  tcsetattr(STDIN_FILENO, TCSANOW, &tty_stdin);

  /* observe that it was automatically disabled on stdout */
  tcgetattr(STDOUT_FILENO, &tty_stdout);
  printf("STDOUT ECHO after changing STDIN: %d\n", tty_stdout.c_lflag & ECHO ? 1 : 0);

  tcsetattr(STDIN_FILENO, TCSANOW, &tty_stdin_restore);
  return 0;
}

ベストアンサー1

ファイル記述子ではなくデバイスの属性を変更しています。ファイル記述子は、話すデバイスを識別する方法にすぎません。たとえば、stdinとstdoutの両方が同じttyの場合/dev/pts/0とどちらが使用されるかは重要ではありません。tcgetattrtcsetattr

定義によっては、エコーには入力と出力が含まれているため、入力にはエコーをイネーブルにし、出力にはイネーブルではないか、その逆の場合が何を意味するのかを想像することは困難です。 ttyドライバがエコーすることもそうでないかもしれません。どのような方法でエコーの動作を修正することに関連する目標を念頭に置いていますか?では、達成したいことを教えてください。これにより、誰かがこれを正しく実行する方法を知ることができます。

おすすめ記事