至少在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。

08-19 18:12