首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >libc函数isatty()是如何工作的?

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

Stack Overflow用户
提问于 2019-06-03 06:18:53
回答 2查看 769关注 0票数 6

我搜索了linux代码库,没有找到它的定义,所以我猜它是C语言附带的东西或类似的东西?我正在尝试理解isatty是如何辨别文件描述符是否是终端的,以及它在技术语言中对“作为终端”的意义。

我真的不确定在哪里可以找到它的实现,如果它是在汇编中,我就不能很容易地跟上它。

EN

回答 2

Stack Overflow用户

发布于 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设备等)时就会被破坏。

票数 2
EN

Stack Overflow用户

发布于 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,如TCGETATCGETS

请注意,对于伪tty的主机端,isatty(3)也将返回true,这并不是真正的tty --在其上执行的大多数与tty相关的操作实际上将应用于其从机端。

在linux上,对于/dev/consoleisatty(3)也会返回true,同样,它也不是一个真正的tty (它不能成为一个进程的控制tty )。

在linux上,您可以通过cat /proc/tty/drivers获得系统上所有tty驱动程序的列表,以及它们的主从编号。当然,这只反映了已经加载的模块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56419346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档