至少在Linux和NetBSD上,对于在伪终端的内部(isatty
,/dev/pts/0
等)或外部(/dev/ttyp0
,/dev/ptmx
等)打开的fds,/dev/ptyp0
返回true,并且我可以方便地测试的所有tcgetxxx
操作也会失败区分。从原则上讲,您可以通过调用fstat
然后查看st_rdev
来进行判断,但是随后您必须知道哪些设备号用于什么,并且在系统之间不一致。
在给定isatty
返回true的任意开放fd的情况下,是否存在一种可移植的方法来判断它是否指向伪终端的外部?伪终端只是在POSIX中粗略地指定的,因此我不认为有任何标准方法,但是我希望至少在当前一代开放源代码Unix上都可以使用这种方法,而无需编译设备编号表每个受支持的操作系统。
(如果您想知道为什么我想知道,这将用于类似lsof
的检查工具。)
最佳答案
根据 ptsname
manual:
char *ptsname(int fd);
ptsname()
函数返回fd
所引用的主对应的从属伪终端设备的名称。
如果使用ENOTTY
,它将失败
fd
不引用伪终端主设备。
因此,您可以先调用isatty()
,然后调用ptsname()
。ptsname()
是
符合POSIX.1-2001,POSIX.1-2008。