你如何判断fd是指伪终结者的内部还是外部?

时间:2018-06-01 21:26:06

标签: c unix pty

至少在Linux和NetBSD上,isatty在内部(/dev/pts/0/dev/ttyp0等)或外部(/dev/ptmx,{{f}打开时返回true假终端的{1}}等等,我可以方便地测试的所有/dev/ptyp0操作也无法区分。原则上,您可以通过调用tcgetxxx然后查看fstat来说明,但是您必须知道哪些设备号用于什么,并且这些设备号在系统之间不一致。< / p>

是否存在一种可移植的方式,给定st_rdev返回true的任意开放fd,判断它是否指向伪终端的外部?伪终结只是在POSIX中粗略指定,所以我认为没有任何标准方式,但我希望有一种适用于当前一代开源Unix的方法至少,无需为每个支持的操作系统编译设备编号表。

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

1 个答案:

答案 0 :(得分:3)

根据ptsname manual

  

<强> char *ptsname(int fd);

     

ptsname()函数返回与fd引用的 master 对应的 slave 伪终结设备的名称。

如果

,它将失败ENOTTY
  

fd未引用伪终端设备。

因此,您可以先拨打isatty(),然后拨打ptsname()

ptsname()

  

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