通过 tcsetattr(fd.....) 设置终端属性时,fd 可以是 stdout 或 stdin 吗?

hum*_*ace 4 c linux terminal termios

我一直在寻找man 3 tcgetattr(因为我想更改程序中的终端设置)并找到了这个。

int tcgetattr(int fd, struct termios *termios_p);

int tcsetattr(int fd, int optional_actions,
              const struct termios *termios_p);
Run Code Online (Sandbox Code Playgroud)

题:

我想知道fd应该是什么意思?(似乎是stdin,但我不明白为什么)?

背景

我的理解是终端是一起输入和输出,因为我的理解是 a/dev/tty/dev/ptyyields stdinstdout以及stderr一起。

Chr*_*odd 6

fd代表文件描述符,它是对操作系统文件对象的引用。因为它是一个引用,多个不同的文件描述符可能引用同一个文件对象。

stdin, stdout, 和stderrFILE *对象——指向stdio数据FILE结构的实际指针。您可以使用该fileno函数获取引用底层 OS 对象的文件描述符。

所以这里有两个间接级别。TheFILE *都可以指同一个FILE,但它们不是;有3个独立FILE的对象stdinstdoutstderr。这些FILE对象每个都包含一个文件描述符,通常为 0、1 和 2(我通常说的是 - OS/lib 以这种方式设置它们,并且只有在您在程序中明确更改它们时它们才会更改)。这 3 个文件描述符通常都指向同一个底层 OS 对象,它是一个单一的终端对象。

由于(通常)只有一个终端,并且所有这些文件描述符(通常)都引用它,因此将哪个 fd(0、1 或 2)用作tcsetaddr.

请注意,这可能的,这些fds到引用不同的对象-如果你开始重定向程序(<>在shell),那么一个或多个的他们会参考一些其他的文件对象,而不是终端。