c - 如何判断 fd 是指伪终端的内部还是外部?
问题描述
至少在 Linux 和 NetBSD 上,对于在伪终端的内部( 、等)或外部(、等)isatty
上打开的 fds 返回 true ,并且我可以方便地测试的所有操作也无法区分。原则上,您可以通过调用然后查看来判断,但是您必须知道哪些设备编号用于什么,这在系统之间并不一致。/dev/pts/0
/dev/ttyp0
/dev/ptmx
/dev/ptyp0
tcgetxxx
fstat
st_rdev
有没有一种可移植的方式,给定一个返回 true 的任意 open fd isatty
,来判断它是否指代伪终端的外部?伪终端在 POSIX 中只是粗略地指定,所以我认为没有任何标准方法,但我希望至少有一种方法可以在当前一代的开源 Unix 上工作,而不必编译设备编号表每个支持的操作系统。
(这将用于lsof
类似的检查工具,以防您想知道我为什么想知道。)
解决方案
根据ptsname
手册:
char *ptsname(int fd);
该
ptsname()
函数返回与所指的主设备相对应的从伪终端设备的名称。fd
它会失败,ENOTTY
如果
fd
不是指伪终端主设备。
所以你可以先调用isatty()
然后再调用ptsname()
。
并且ptsname()
是
符合 POSIX.1-2001、POSIX.1-2008。
推荐阅读
- firebase - 编写 DTO 类来构建从不同数据源获取信息的对象
- c# - 由于应用程序一直挂起,C# 无法将 DataGridView 保存为 png
- ios - 更改方向时,SwiftUI 中的 SKScene 未填充屏幕
- python - 从数据框中的字符串中删除所有标点符号
- javascript - 如何在 html 中为 Javascript 添加 onclick 事件 - 非程序员
- pandas - 如何获得 dask 系列结构中的值?
- php - 如何使用 php header 设置多个 cookie
- python - 如何将字典拆分为训练集和测试集 Python,其中每个项目的值是 99*160 大小的数值列表
- excel - 使用文件资源管理器将多个嵌入式 OLE 对象保存到目标文件夹
- python - 'float' 对象不可迭代应用 lambda 函数