1 定义 ngx_epoll_notify 函数 定义在 ./nginx-1.24.0/src/event/modules/ngx_epoll_module.cstatic ngx_int_t ngx_epoll_notify ( ngx_event_handler_pt handler) { static uint64_t inc= 1 ; notify_event. data= handler; if ( ( size_t ) write ( notify_fd, & inc, sizeof ( uint64_t ) ) != sizeof ( uint64_t ) ) { ngx_log_error ( NGX_LOG_ALERT, notify_event. log, ngx_errno, "write() to eventfd %d failed" , notify_fd) ; return NGX_ERROR; } return NGX_OK; } `ngx_epoll_notify` 函数的作用是: 主动唤醒阻塞在 `epoll_wait` 上的事件循环, 并指定唤醒后需执行的回调函数。 它通过向 eventfd 写入一个 8 字节整数(值为 1), 使 epoll 立即返回,从而让 nginx 的事件框架在随后的分派中调用预先设置好的 `handler`,2 详解 1 函数签名 static ngx_int_t ngx_epoll_notify ( ngx_event_handler_pt handler) 返回值 成功返回 NGX_OK(宏定义为 0), 失败返回 NGX_ERROR(宏定义为 -1参数 ngx_event_handler_pt handler 调用者传入一个具体的事件处理函数地址 向 eventfd 写入数据唤醒事件循环,当 epoll_wait 返回后, 事件模块会将该事件分发给这个 handler 函数,并以 notify_event 的地址作为参数调用它2 逻辑流程 1 局部变量 2 设置处理函数 3 写入 4 返回成功1 局部变量{ static uint64_t inc= 1 ; 初始化为 1 eventfd 的写入必须提供 8 字节的无符号整数, 内核将其值累加到内部计数器。 inc 固定为 1,每次 write 时写入此值,既满足长度要求,又仅让计数器递增 12 设置处理函数notify_event. data= handler; 将传入的 handler 函数指针保存到全局事件 notify_event 的 data 字段 事件循环可以通过 notify_event.data 获得并调用这个 handler3 写入if ( ( size_t ) write ( notify_fd, & inc, sizeof ( uint64_t ) ) != sizeof ( uint64_t ) ) { ngx_log_error ( NGX_LOG_ALERT, notify_event. log, ngx_errno, "write() to eventfd %d failed" , notify_fd) ; return NGX_ERROR; } 向 notify_fd 写入 8 字节数据,并判断是否成功写入指定字节数4 返回成功return NGX_OK; }