1. 概览
在进入 second stage init 讲解之前,先来看看它事件监听及处理的机制 – Epoll 类,它实际上是对 epoll 的封装,使他变得更加适合再 init 中来跟踪事件以及分发触发方法等。整个类只有 4 个方法,在如此小巧的条件下实现了:事件监听的注册、卸载、跟踪以及收集事件的处理方法。这也意味着用户在注册后,在等待到事件后可以直接调用返回的处理方法列表。
2.整体使用骨架
second init 中就是使用 Epoll 来跟踪事件并处理的,下面看下 Epoll 的使用流程。
//system\core\init\init.cpp
SecondStageMain
//code 1
Epoll epoll;
epoll.Open();
//code 2
InstallInitNotifier(&epoll);
auto clear_eventfd = [] {
uint64_t counter;
TEMP_FAILURE_RETRY(read(wake_main_thread_fd, &counter, sizeof(counter)));
};
epoll->RegisterHandler(wake_main_thread_fd, clear_eventfd)
//code 3
while (true) {
auto pending_functions = epoll.Wait(epoll_timeout);
for (const auto& function : *pending_functions) {
(*function)();

文章详细介绍了Epoll类在secondstageinit中的作用,如何进行事件监听注册、卸载和跟踪,以及如何处理事件。Epoll通过Open方法创建句柄,RegisterHandler用于注册监听对象和处理方法,而Wait方法则用于等待事件并返回处理方法列表。整个过程简洁高效,但在单线程环境下,过多的监听对象或处理耗时可能会影响性能。
最低0.47元/天 解锁文章
926

被折叠的 条评论
为什么被折叠?



