linux - 关于epoll_insert的详细函数

标签 linux io linux-kernel linux-device-driver epoll

epoll_insert函数被sys_epoll_ctl调用。

epoll_insert函数中有几个关键步骤:

  1. 使用队列回调初始化轮询表:ep_ptable_queue_proc

  2. 它会调用file->f_op->poll

  3. 如果文件已经“就绪”,那么我们将其放入就绪列表

    /* If the file is already "ready" we drop it inside the ready list */
    if ((revents & event->events) && !ep_is_linked(&epi->rdllink)) {
    
        list_add_tail(&epi->rdllink, &ep->rdllist);
    
        /* Notify waiting tasks that events are available */
        if (waitqueue_active(&ep->wq))
            wake_up_locked(&ep->wq);
        if (waitqueue_active(&ep->poll_wait))
            pwake++;
    }
    

我不明白为什么要在 epoll_insert 函数中检查文件是否就绪。我们应该在 ep_poll_callback 函数中检查它吗?

最佳答案

ep_poll_callback 仅在其中一个文件描述符的状态发生变化时调用。如果那是唯一将 epoll 描述符添加到读取列表的地方,您可能会错过在设法将它们添加到 epoll 之前发生的事件。例如,在 Web 服务器中,如果客户端请求是在连接后立即发送的,您可能会错过该请求。

关于linux - 关于epoll_insert的详细函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38800281/

相关文章:

c - 为什么这个程序的输出中多了一个 "*"?

基于 Linux 内核头文件中功能的条件编译

linux - 错误 : grep: find: Is a directory

c# - 如何检查文件锁定?

linux - 如何在 Linux 上的 C 中查找未初始化的变量?

将文件中的电话号码转换为新格式

linux - kernel_init 标记为 __ref

linux -/usr/bin/time 使用 SPARK 时针对 TOP 的 CPU 利用率

android - openssl s_client -connect 默认为子域?

linux - Glibc编译错误