正在开发 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/