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

标签 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);

问题:

我想知道fd 是什么意思? (好像是stdin,但我不明白为什么)?

背景

我的理解是终端是一起输入和输出的,因为我的理解是 /dev/tty/dev/pty 产生 stdinstdoutstderr 在一起。

最佳答案

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

stdin , stdout , 和 stderrFILE *对象——指向 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/

相关文章:

c - 将结构指针作为参数传递

c - int * p 和 int p* 有什么区别?

c - DLL 内部和外部的函数指针值

c - 如果没有必要的 header ,我的代码如何正确编译?

c - select() 函数的第一个参数到底是什么

HTML 到 ANSI 彩色终端文本

linux - 为什么协议(protocol)族宏和地址族宏是重复的

python 套接字应用程序未按预期从终端运行

linux - 无法在 Manjaro 中连接 MongoDB 服务器,退出代码为 100 的错误

python - 使用 Python 在远程机器上执行命令