繁体   English   中英

是否有系统调用或某种方式来了解 Linux 中文件描述符的类型(例如常规文件 fd、套接字 fd、信号 fd、计时器 fd)?

[英]Is there a system call or some way to know the type of file descriptor in Linux (e.g. regular file fd, socket fd, signal fd, timer fd)?

正如我不断发现的那样,有各种各样的文件描述符 - 几乎所有东西都围绕文件描述符抽象:常规文件、套接字、信号和计时器(例如)。 所有文件描述符都只是整数。

给定一个文件描述符,是否有可能知道它是什么类型? 例如,有一个像 getFdType(fd) 这样的系统调用会很好。

如果由于多个文件描述符准备就绪而唤醒 epoll_wait,则每个文件描述符的处理将基于其类型。 这就是我需要类型的原因。

当然,我可以自己单独维护这些信息,但让系统支持它会更方便。

此外,无论类型如何,所有文件描述符都是连续的。 我的意思是,如果您打开一个常规数据文件,然后创建一个计时器文件描述符,然后创建一个信号文件描述符,它们是否都保证按顺序编号?

正如“那个其他人”所提到的,最明显的此类调用是fstat st_mode成员包含用于区分常规文件、设备、套接字、管道等的位。

但在实践中,您几乎肯定需要自己跟踪哪个 fd 是哪个。 当您打开多个不同的常规文件时,知道它是一个常规文件并没有太大帮助。 因此,既然您无论如何都必须在代码中的某处维护此信息,那么回溯该记录似乎是最可靠的方法。

(检查程序中的某些变量也比进行一个或几个额外的系统调用要快得多。)

此外,无论类型如何,所有文件描述符都是连续的。 我的意思是,如果您打开一个常规数据文件,然后创建一个计时器文件描述符,然后创建一个信号文件描述符,它们是否都保证按顺序编号?

并不真地。

据我所知,创建新 fd 的调用将始终返回编号最低的可用 fd。 有一些旧程序依赖于这种行为; dup2存在之前,我相信将标准输入移动到新文件的公认方法是close(0); open("myfile", ...); close(0); open("myfile", ...); .

然而,很难真正确定哪些 fds 可用。 例如,用户可能以/usr/bin/prog 5>/some/file/somewhere运行你的程序,然后看起来 fd 5 被跳过了,因为/some/file/somewhere已经在 fd 5 上打开了。因此,如果您连续打开一堆文件,则无法真正确定您将获得连续的 fd,除非您自己刚刚关闭了所有这些 fd 并且确定所有编号较低的 fd 都已在使用中。 这样做似乎比首先跟踪 fds 更麻烦(也是潜在问题的根源)。

暂无
暂无

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

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