至少在Linux和NetBSD上,对于在伪终端的内部(/dev/pts/0
、/dev/ttyp0
等)或外部(/dev/ptmx
、/dev/ptyp0
等)打开的fds,isatty
返回true,并且我可以方便地测试的所有tcgetxxx
操作也无法区分。原则上,您可以通过调用fstat
然后查看st_rdev
来判断,但是您必须知道哪些设备编号用于什么用途,这在系统中并不一致。
有没有一种便携的方法,给出一个任意打开的fd,isatty
返回true,来判断它是否指的是伪终端的外部?伪终端在POSIX中只有粗略的规定,所以我不认为有任何标准的方法,但我希望至少有一种方法可以在当前一代的开源Unixes上工作,而不必为每个支持的操作系统编译一个设备号表。
(这将用于lsof
-like检查工具,如果您想知道我为什么想知道的话。)
发布于 2018-06-02 08:43:06
根据ptsname
manual的说法
char *ptsname(int fd);
ptsname()
函数返回引用的主对应的从伪终端设备的名称。
如果出现以下情况,它将使用ENOTTY
失败
fd
不是指伪终端主设备。
因此,您可以先调用isatty()
,然后调用ptsname()
。
而ptsname()
是
符合POSIX.1-2001、POSIX.1-2008的
。
https://stackoverflow.com/questions/50651184
复制相似问题