Tty

為什麼更改一個文件描述符上的 tty 設置會影響另一個文件描述符?

  • July 9, 2017

ECHO預設情況下在標準輸入和標準輸出上啟用設置。但是為什麼如果我們ECHO在標準輸入上禁用,它也會在 上被禁用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;
}

您正在更改設備的屬性,而不是文件描述符。文件描述符只是辨識您正在談論的設備的一種方式。如果 stdin 和 stdout 都是相同的 tty (/dev/pts/0例如),那麼你使用哪個 tty 並不tcgetattr重要tcsetattr

由於根據定義回顯涉及輸入和輸出,因此很難想像在輸入而不是輸出上啟用回顯可能意味著什麼,反之亦然。tty 驅動程序要麼會回顯,要麼不會。您是否有一個涉及以某種方式修改迴聲行為的目標?如果是這樣,請說出您要完成的工作,也許有人會知道如何正確地做到這一點。

引用自:https://unix.stackexchange.com/questions/377262