【问题标题】:How can you tell whether an fd refers to inside or the outside of a pseudoterminal?如何判断 fd 是指伪终端的内部还是外部?
【发布时间】:2018-06-01 21:26:05
【问题描述】:

至少在 Linux 和 NetBSD 上,isatty 在伪终端的内部(/dev/pts/0/dev/ttyp0 等)或外部(/dev/ptmx/dev/ptyp0 等)打开的 fds 返回 true ,并且我可以方便地测试的所有tcgetxxx 操作也无法区分。原则上,您可以通过调用fstat 然后查看st_rdev 来判断,但是您必须知道哪些设备号用于什么,这在不同系统之间并不一致。

如果给定isatty 返回 true 的任意打开 fd,是否有一种可移植的方式来判断它是否指代伪终端的外部?伪终端在 POSIX 中只是粗略地指定,所以我认为没有任何 标准 方式,但我希望至少有一种方式可以在当前一代的开源 Unix 上工作,而无需为每个支持的操作系统编译一个设备编号表。

(这将用于类似lsof 的检查工具,以防你想知道我为什么想知道。)

【问题讨论】:

  • 根据linux上man ioctl_tty的说法,TIOCPKT ioctl只能应用到一个pseudotty的master端;否则,你会得到 ENOTTY。我还没有测试过它或任何东西。
  • 注意:我有意使用术语“外部”和“内部”来表示大多数伪终端文档分别称为“主”和“从”,因为我认为这在概念上更清晰。请不要更改此设置。
  • '不是我,老大。但我确实认为,虽然您可能会发现“内部”和“外部”这两个术语在概念上更令人满意,但“主”和“从”这两个术语是常用的,它可能对我们这些熟悉这些术语的人有所帮助对扎克的概念不太熟悉,所以把它们放在括号里。当然,在这种情况下,真的只需要了解这两个术语之间存在双射,我觉得没有必要弄清楚它是什么。所以也许没有必要指定它。
  • 不确定其他人,但“内部”和“外部”真的让我感到困惑。 PTY master和slave就像不是insideoutside的两个端点。
  • @EmilyE。这对我来说很奇怪。对我来说,伪终端两侧之间的不对称似乎完全被“内部”和“外部”捕获。属于控制终端为 pty 的会话的进程打开内部 fd,负责捕获终端 I/O 并将其转发到屏幕或网络隧道或任何与外部 fd 一起工作的进程。为什么这对你来说似乎是一个不恰当的类比?

标签: c unix pty


【解决方案1】:

根据ptsname manual

char *ptsname(int fd);

ptsname() 函数返回与fd 所指的ma​​ster 对应的slave 伪终端设备的名称。

如果出现ENOTTY,它将失败

fd 不指代伪终端 ma​​ster 设备。

所以您可以先拨打isatty(),然后拨打ptsname()

ptsname()

符合 POSIX.1-2001、POSIX.1-2008。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多