为什么更改一个文件描述符上的 tty 设置会影响另一个文件描述符?

为什么更改一个文件描述符上的 tty 设置会影响另一个文件描述符?

ECHO默认情况下,在 stdin 和 stdout 上启用设置。但是为什么如果我们ECHO在 stdin 上禁用,它也会在 上禁用stdout?它们有两个单独的描述符 -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 驱动程序要么会回显,要么不会。您心中是否有一个涉及以某种方式修改回声行为的目标?如果是这样,请说出您想要实现的目标,也许有人会知道如何正确地做到这一点。

相关内容