libc 函数 isatty() 是如何工作的?

tem*_*ame 6 c unix libc

我搜索了 linux repo 并找不到它的定义,所以我猜它是 C 或类似的东西?我试图了解如何isatty能够判断文件描述符是否是终端,甚至用技术语言来说“成为终端”意味着什么。

我不确定在哪里可以找到它的实现,如果它在组装中,我真的无法很容易地跟随它。

R..*_*R.. 8

实现的一般策略isatty是尝试ioctl对文件描述符执行特定于 tty 的操作,并检查ENOTTY错误结果。传统上,使用TCGETS,它是该函数的后端tcgetattr,但这有点危险,因为ioctlLinux 上它的编号与旧版 OSS 声音设备冲突,并且如果文件描述符实际上引用某种类型的 MIDI 设备,它将对设备进行更改。在 musl libc 中,我们使用TIOCGWINSZ“获取窗口大小”操作,其编号不会无意中被任何其他类型的设备重用,并且ENOTTY对于非 tty 设备,该操作会可靠地失败。

理论上,您可以使用fstat并检查st_rdev设备主编号字段,但这需要一个所有设备主设备(ttys)的硬编码列表,并且在添加新类型时(例如 USB 串行/ ACM 设备、uartlite 设备等)。