【发布时间】:2020-02-25 17:53:38
【问题描述】:
正如我不断发现的那样,有各种各样的文件描述符 - 几乎所有东西都围绕文件描述符进行抽象:常规文件、套接字、信号和计时器(例如)。所有文件描述符都只是整数。
给定一个文件描述符,是否有可能知道它是什么类型?例如,最好有一个系统调用,例如 getFdType(fd)。
如果由于多个文件描述符准备就绪而唤醒了 epoll_wait,则每个文件描述符的处理将基于其类型。这就是我需要类型的原因。
当然,我可以自己单独维护这些信息,但让系统支持会更方便。
此外,所有文件描述符,无论类型如何,都是顺序的。我的意思是如果你打开一个常规的数据文件,然后创建一个计时器文件描述符,然后一个信号文件描述符,它们都保证按顺序编号吗?
【问题讨论】:
-
最好问一下,例如出于调试/分析原因检查任意 FD,而不是将其用于 epoll 决策,因为这是一个限制性的设计决策和架构死胡同。 AFAIK 没有像
getFdType这样的东西,但传统上一直有fstat来区分类似文件的类型,并尝试像getsockopt或timerfd_gettime这样的 fd 特定调用来区分这些,作为最后的手段,readlinkon @ 987654327@ 获取描述性字符串,如anon_inode:[timerfd] -
这是 fstat 调用。 linux.die.net/man/2/fstat
-
@thatotherguy “......因为这是一个限制性的设计决策和架构死胡同。”你能详细说明吗?如果需要,我对架构更改持开放态度。
-
无论如何,大多数服务器都需要为每个 FD 提供额外的上下文和元数据,例如其当前协议特定的状态/标志、发送/接收队列或位置、水印/重试信息等。
-
@thatotherguy 我已经解决了这方面的问题。我的 fdData 结构维护这样的信息。我认为 Nate 观察到使用系统调用(如果可用)会很昂贵,这是我没有想到的。
标签: linux sockets timer signals epoll