我搜索了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设备等)。