繁体   English   中英

你怎么知道fd是指伪终端的内部还是外部?

[英]How can you tell whether an fd refers to inside or the outside of a pseudoterminal?

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

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

(如果您想知道为什么我想知道,这将用于lsof的检查工具。)

根据ptsname手册

char *ptsname(int fd);

ptsname()函数返回与fd引用的主服务器对应的从属伪终端设备的名称。

如果是,它会因ENOTTY而失败

fd不是指伪终端设备。

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

并且ptsname()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM