gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:58:35 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

正如“那个人”所提到的,最明显的此类调用是 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 的调用将始终返回编号最小的可用 fd。有依赖于这种行为的旧程序;在 dup2 存在之前,我相信将标准输入移动到新文件的公认方法是 close(0);打开(“我的文件”,...);

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

关于linux - 是否有系统调用或某种方式知道 Linux 中文件描述符的类型(例如常规文件 fd、套接字 fd、信号 fd、计时器 fd)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60400581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com