ECHO
默认情况下,在 stdin 和 stdout 上启用设置。但是为什么如果我们ECHO
在 stdin 上禁用,它也会在 上禁用stdout
?它们有两个单独的描述符 -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;
}
答案1
您正在更改设备的属性,而不是文件描述符。文件描述符只是识别您正在谈论的设备的一种方式。如果 stdin 和 stdout 都是相同的 tty(例如),那么使用和/dev/pts/0
中的哪一个并不重要。tcgetattr
tcsetattr
由于根据定义回显涉及输入和输出,因此很难想象在输入而不是输出上启用回显意味着什么,反之亦然。 tty 驱动程序要么会回显,要么不会。您心中是否有一个涉及以某种方式修改回声行为的目标?如果是这样,请说出您想要实现的目标,也许有人会知道如何正确地做到这一点。