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;
}
ファイル記述子ではなく、デバイスの属性を変更しています。ファイル記述子は、話しているデバイスを識別するための単なる方法です。 stdinとstdoutの両方が同じttyの場合(/dev/pts/0
たとえば)、tcgetattr
とtcsetattr
のどちらを使用してもかまいません。
定義上、エコーには入力と出力が含まれるため、エコーが出力ではなく入力で有効になる、またはその逆の場合の意味を想像するのは困難です。 ttyドライバーがエコーするか、エコーしません。エコーの動作を何らかの方法で変更することを含む目標を念頭に置いていましたか?もしそうなら、あなたが達成しようとしていることを言ってください、そして多分誰かがそれを正しくする方法を知っているでしょう。