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

2023-12-25

我一直在研究人 3 tcgetattr http://linux.die.net/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 or /dev/pty yields stdin, stdout and stderr一起。


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

stdin, stdout, and stderr are FILE *对象——指向 stdio 的实际指针FILE数据结构。您可以使用以下命令获取引用底层操作系统对象的文件描述符fileno功能。

所以这里有两个间接级别。这FILE *都可以指同一个FILE,但他们没有;有3个独立的FILE对象为stdin, stdout, and stderr。这些FILE每个对象都包含一个文件描述符,通常为 0、1 和 2(我说的是通常 - 操作系统/lib 以这种方式设置它们,并且只有在程序中显式更改它们时它们才会更改)。这 3 个文件描述符通常都会引用同一个底层操作系统对象,即单个终端对象。

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

请注意,它is对于这些可能fds 来引用不同的对象——如果您使用重定向启动程序(< or >在 shell 中),那么其中一个或多个将引用其他文件对象而不是终端。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐