我搜索了linux代码库,没有找到它的定义,所以我猜它是C语言附带的东西或类似的东西?我正在尝试理解isatty
是如何辨别文件描述符是否是终端的,以及它在技术语言中对“作为终端”的意义。
我真的不确定在哪里可以找到它的实现,如果它是在汇编中,我就不能很容易地跟上它。
发布于 2019-06-03 06:30:58
实现isatty
的一般策略是尝试对文件描述符执行特定于tty的ioctl
操作,并检查ENOTTY
错误结果。传统上,使用TCGETS
,它是tcgetattr
函数的后端,但这有点危险,因为它在Linux上的ioctl
编号与传统的操作系统声音设备冲突,如果文件描述符实际上引用了某种类型的MIDI设备,它将对设备进行更改。在musl libc中,我们使用TIOCGWINSZ
,即“获取窗口大小”操作,它的编号不会被任何其他类型的设备无意中重复使用,对于非tty设备,它在使用ENOTTY
时会可靠地失败。
理论上,你可以用fstat
检查st_rdev
字段中的设备主机号,但是这需要一个硬编码的列表,所有的设备主机号都是tty,并且在添加新类型(例如USB-串行/ACM设备、uartlite设备等)时就会被破坏。
发布于 2019-06-03 10:01:10
isatty(3)
是一个库函数(在linux内核中找不到任何关于它的东西),通常通过调用tcgetattr(3)
并检查其返回值来实现。
例如,在GNU C library (Glibc)中:
/* Return 1 if FD is a terminal, 0 if not. */
int
__isatty (int fd)
{
struct termios term;
return __tcgetattr (fd, &term) == 0;
}
tcgetattr(3)
本身将解析为某个ioctl,如TCGETA
或TCGETS
。
请注意,对于伪tty的主机端,isatty(3)
也将返回true,这并不是真正的tty --在其上执行的大多数与tty相关的操作实际上将应用于其从机端。
在linux上,对于/dev/console
,isatty(3)
也会返回true,同样,它也不是一个真正的tty (它不能成为一个进程的控制tty )。
在linux上,您可以通过cat /proc/tty/drivers
获得系统上所有tty驱动程序的列表,以及它们的主从编号。当然,这只反映了已经加载的模块。
https://stackoverflow.com/questions/56419346
复制相似问题