web-dev-qa-db-ja.com

あるファイル記述子のtty設定を変更すると、別のファイル記述子に影響するのはなぜですか?

ECHO設定は、デフォルトでstdinおよびstdoutで有効になっています。しかし、stdinでECHOを無効にすると、stdoutでも無効になるのはなぜですか。それらには2つの別個の記述子があります-0および1では、なぜ同じファイル記述子があるかのように同時に変更されるのでしょうか。

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

#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;
}
2
Igor Liferenko

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

定義上、エコーには入力と出力が含まれるため、エコーが出力ではなく入力で有効になる、またはその逆の場合の意味を想像するのは困難です。 ttyドライバーがエコーするか、エコーしません。エコーの動作を何らかの方法で変更することを含む目標を念頭に置いていましたか?もしそうなら、あなたが達成しようとしていることを言ってください、そして多分誰かがそれを正しくする方法を知っているでしょう。

3
user41515