是否有系统调用或某种方式知道 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由于多个文件描述符就绪而被唤醒,则每个文件描述符的处理将基于其类型。这就是我需要这种类型的原因。

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

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

如"that other guy"所述,最明显的此类调用是fstatst_mode 成员包含用于区分常规文件、设备、套接字、管道等的位。

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

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

Also, are all file descriptors, irrespective of the type, sequential. I mean if you open a regular data file, then create a timer file descriptor, then a signal file descriptor, are they all guaranteed to be numbered sequentially?

不是真的。

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

但是,很难真正确定哪些 fds 可用。例如,用户可能将 运行 您的程序设置为 /usr/bin/prog 5>/some/file/somewhere 然后它会显示 fd 5 被跳过,因为 /some/file/somewhere 已经在 fd 5 上打开。因此,如果您打开一堆连续的文件,你不能真正确定你会得到连续的 fds,除非你自己关闭了所有这些 fd 并确定所有编号较低的 fd 都已经在使用中。这样做似乎比一开始就跟踪 fds 更麻烦(并且是潜在问题的根源)。