libevent源码分析--I/O 定时 信号 被处理的安排

关于这几个事件对应的初何时何地初始化、何时何地事件被添加、何时何地添加到激活队列、处理流程:

一、i/o事件

       I/O事件的初始化是在event_set函数中被初始化

       I/O事件的添加是在event_add函数中进行

二、定时事件

       定时事件的初始化是在event_add函数中进行,这个函数初始化了一些I/O和定时事件

      定时事件添加到激活队列中是使用timeout_process(),函数是在event_dispatch中被调用,在回调函数event_wait返回以后进行

三、信号事件

       信号事件的初始化在epoll_init,这个init作为回调被event_init()函数调用,在epoll_init函数中调用了evsignal_init()函数来初始化和处理信号事件相关的操作,设置了evsignal_info结构体中的内部socket作为一个被监听的事件,在这个event中负责recv一个字节,这样就可以知道信号事件被触发!

    信号事件的添加在epoll_add函数中,在epoll_add函数中,如果是信号事件,就直接调用evsignal_add函数,如果是别的事件,将一个epoll_event和这个event相互关联即可

    在evsignal_add函数中,设置一个回调函数evsignal_handler,这个函数可以使得在用户自定义的信号为sig的信号事件发生时evsignal_handler被调用,evsignal_handler函数只是使用套接字发送一个字节,结束者就是evsignal_init函数中event_set的套接字。然后将evsignal_info结构体中的内部socket通过调用event_add函数添加到所要监听的队列中,

    信号事件的处理,在epoll_dispatch()函数中,如果epoll_wait()函数返回,说明可能是信号事件被触发,使用evsignal_process()函数将信号事件添加到激活队列中

    在evsignal_process函数中将信号事件添加到激活队列中。

   虽说在evsignal_add函数总调用了event_add,在event_add也有调用evsignal_add,但是这两者对应的对象不一样,event_add对应的事件类型是EV_SIGNAL,但是在evsignal_add函数中调用event_add添加的ev_signal使用的是EV_READ类型


所以三类事件处理都是在event_process_active(),说不过事件的初始化和注册不在一个地方

在分析的过程中,随手注释了代码中的一部分,不停的理解,不停的注释,肯定有不恰当的地方,共同学习

链接:http://download.csdn.net/detail/yusiguyuan/7007611


你可能感兴趣的:(c,libevent)