c - 读取许多真实的文件描述符

标签 c select epoll

正在开发 Linux (Ubuntu) 应用程序。我需要以非阻塞方式读取许多文件。不幸的是,epoll 不支持真正的文件描述符(来自文件的文件描述符),它支持作为网络套接字的文件描述符。 select 确实适用于真实的文件描述符,但它有两个缺点,1) 它很慢,线性地遍历所有设置的文件描述符,2) 它是有限的,它通常不允许超过1024 个文件描述符。

我可以将每个文件描述符更改为非阻塞并使用非阻塞“读取”来轮询,但它非常昂贵,尤其是当有大量文件描述符时。

这里有哪些选项?

谢谢。

更新 1 这里的用例是创建某种文件服务器,许多客户端请求文件,以非阻塞方式为它们提供服务。由于网络端实现(不是标准的 TCP/IP 堆栈),无法使用 sendfile()。

最佳答案

您可以将多个 select 调用与线程或 fork 结合使用。这将减少每个 select 集的 FD_ISSET 调用数。

也许您可以提供有关您的用例的更多详细信息。听起来您正在使用 select 来监视文件更改,这与您对常规文件的预期不同。也许您只是在寻找 flock

关于c - 读取许多真实的文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866132/

相关文章:

c - 数据类型中的位数

mysql - 如何在查询中使用参数

c - 向轮询监听套接字的 epoll 实例以外的 epoll 实例添加新套接字

c - 为什么strcpy会读取多余的字符?

c - 简单的 C 程序会被编译为 Microsoft 的中间运行时语言还是 Windows 中的机器代码

ios - 将 FDLIBM 库集成到 iOS

PHP 选择语句不起作用?

javascript - 如何使用 javascript 从 iframe 中获取选定的文本?

multithreading - libuv 与原始 epoll 或 IOCP

epoll - 如何将 epoll 与 data->ptr 一起使用,而不是 data.fd?