Tty
為什麼更改一個文件描述符上的 tty 設置會影響另一個文件描述符?
ECHO
預設情況下在標準輸入和標準輸出上啟用設置。但是為什麼如果我們ECHO
在標準輸入上禁用,它也會在 上被禁用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; }
您正在更改設備的屬性,而不是文件描述符。文件描述符只是辨識您正在談論的設備的一種方式。如果 stdin 和 stdout 都是相同的 tty (
/dev/pts/0
例如),那麼你使用哪個 tty 並不tcgetattr
重要tcsetattr
。由於根據定義回顯涉及輸入和輸出,因此很難想像在輸入而不是輸出上啟用回顯可能意味著什麼,反之亦然。tty 驅動程序要麼會回顯,要麼不會。您是否有一個涉及以某種方式修改迴聲行為的目標?如果是這樣,請說出您要完成的工作,也許有人會知道如何正確地做到這一點。