我搜索了Linux存储库,但找不到它的定义,所以我想它是C或类似的东西?我试图了解isatty如何分辨文件描述符是否是终端,以及用技术语言来说“成为终端”的含义。

我不确定在哪里可以找到它的实现,如果它在组装中,我将很难真正地跟随它。

最佳答案

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

从理论上讲,您可以使用fstat进行操作,并检查st_rdev字段以获取设备主设备号,但是这将需要所有设备主设备(包括ttys)的硬编码列表,并且在添加新类型时会损坏(例如USB-串行/ACM设备,uartlite设备等)。

10-06 11:19