【发布时间】: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就像不是inside和outside的两个端点。
-
@EmilyE。这对我来说很奇怪。对我来说,伪终端两侧之间的不对称似乎完全被“内部”和“外部”捕获。属于控制终端为 pty 的会话的进程打开内部 fd,负责捕获终端 I/O 并将其转发到屏幕或网络隧道或任何与外部 fd 一起工作的进程。为什么这对你来说似乎是一个不恰当的类比?