我一直在寻找 man 3 tcgetattr (因为我想更改程序中的终端设置)并找到了这个。
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,
const struct termios *termios_p);
问题:
我想知道fd
是什么意思? (好像是stdin
,但我不明白为什么)?
背景
我的理解是终端是一起输入和输出的,因为我的理解是 /dev/tty
或 /dev/pty
产生 stdin
、stdout
和 stderr
在一起。
最佳答案
fd
代表文件描述符,它是对操作系统文件对象的引用。因为它是引用,所以多个不同的文件描述符可能引用同一个文件对象。
stdin
, stdout
, 和 stderr
是 FILE *
对象——指向 stdio 的实际指针 FILE
数据结构。您可以使用 fileno
获取引用底层操作系统对象的文件描述符。功能。
所以这里有两个间接级别。 FILE *
都可以指代相同的 FILE
,但他们没有;有 3 个独立的 FILE
stdin
的对象, stdout
, 和 stderr
.这些FILE
每个对象都包含一个文件描述符,通常是 0、1 和 2(我说的是正常情况——OS/lib 以这种方式设置它们,只有在您的程序中明确更改它们时它们才会更改)。 3 个文件描述符通常都指向同一个底层操作系统对象,即单个终端对象。
因为(通常)只有一个终端,并且所有这些文件描述符(通常)都引用它,所以使用哪个 fd(0、1 或 2)作为 tcsetaddr
的第一个参数并不重要。 .
请注意,这些 fd
可能 s 引用不同的对象——如果您使用重定向(<
或 >
在 shell 中)启动程序,那么其中一个或多个将引用其他文件对象而不是终端。
关于c - 通过tcsetattr(fd.....)设置终端属性时,fd可以是stdout还是stdin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35873843/