首页 > 解决方案 > 如何判断 fd 是指伪终端的内部还是外部?

问题描述

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

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

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

标签: cunixpty

解决方案


根据ptsname手册

char *ptsname(int fd);

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

它会失败,ENOTTY如果

fd不是指伪终端设备。

所以你可以先调用isatty()然后再调用ptsname()

并且ptsname()

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


推荐阅读