使用epoll时,我应该如何处理文件描述符'依赖'?

时间:2017-12-24 17:19:06

标签: c multithreading sockets file-descriptor epoll

我正在使用epoll在C中编写HTTP / 2服务器。假设客户端要求/index.html - 我需要打开一个指向该文件的文件描述符,然后每当我读取它的一大块时就将其发送回套接字。所以我有一个看起来像这样的事件循环:

while (true)
    events = epoll_wait()
    for event in events
        if event is on a socket
            handle socket i/o
        else if event is on a disk file
            read as much as possible, and send to associated socket

但这会带来问题。如果套接字随后关闭(无论出于何种原因),index.html的文件描述符也将关闭。但是index.html FD可能已经排队等待阅读(即,它已经在events,因为你在调用epoll_wait之间关闭了它),因此当循环得到处理FD我现在将访问'悬空'FD。

如果这是一个单线程程序,我会尝试通过查看文件描述符编号来解决问题,但不幸的是我在多个线程上运行相同的epoll循环,这意味着我无法预测哪些FD数字将在特定时刻使用。完全可能的是,当文件上的无效读取到来时,另一个线程将声明FD,因此对read的调用不会明显失败但是我可能会在免费之后获得使用试图将它发送到不再存在的套接字上。

处理此问题的最佳方法是什么?也许我应该采用一种完全不同的方法,而不是在同一个epoll循环上没有文件I / O.

0 个答案:

没有答案