【问题标题】:How does the libc function isatty() work?libc 函数 isatty() 是如何工作的?
【发布时间】:2019-06-02 22:18:53
【问题描述】:

我搜索了 linux repo 并找不到它的定义,所以我猜它是 C 或类似的东西附带的东西?我试图了解isatty 是如何判断文件描述符是否为终端的,以及在技术语言中“成为终端”的含义。

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

【问题讨论】:

  • 我猜“这是一个 tty”只是打开文件时创建的文件描述符结构中的一个标志。进一步阅读unix.stackexchange.com/questions/354373/…
  • 在我的系统上,根据straceisatty 尝试执行仅适用于终端的命令 (ioctl(fd, TCGETS, ...))
  • "在 unix 术语中,tty 是一种特殊类型的设备文件,它实现了除读写之外的许多附加命令 (ioctl)。" 987654322@

标签: c unix libc


【解决方案1】:

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

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

【讨论】:

  • 我认为你弄错了——它是 TCSETS (tcsetattr) 与 alsa 或 oss ioctl 冲突,而不是 TCG ETS (tcgetattr)。如果不是这样,请明确说明与哪个 ioctl TCGETS 冲突。
  • @mosvy: strace 会很高兴地告诉你。
  • strace 告诉我这只是 TCSET[SA][WF]? (A 或 S 取决于 32/64 位)。它没有提及 TCGETS。
  • @mosvy:也许它实际上是旧版本 strace 中的一个错误 - SNDCTL_TMR_TIMEBASE 似乎有一个大小参数可以防止它与 TCGETS 发生冲突,但从历史上看是 strace报告说它可能是。我想知道是否存在 SNDCTL_TMR_TIMEBASE 没有大小字段的旧内核。
  • TCGETS 和 SNDCTL_TMR_TIMEBASE 似乎至少从 linux-1.3.0 开始没有改变。我曾经(错误地)得出与您相同的结论 - 但结果是我在尝试通过 /proc/PID/fd/FD 打开声音设备时被阻止,而不是在调用 isatty(3) 时阻止。
【解决方案2】:

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

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

在 linux 上,isatty(3) 也将为 /dev/console 返回 true,这又不是真正的 tty(它不能成为进程的控制 tty)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2020-07-18
    • 2015-11-08
    • 2017-05-21
    • 2011-04-24
    相关资源
    最近更新 更多