wifidog源码分析Lighttpd1.4.20源码分析之fdevent系统(3) -----使用

接着上文介绍的函数fdevent_linux_sysepoll_event_add 讲解,首先看函数的第三个参数events,他是一个整型,其没以为对应一种IO事件。

上面fdevent_event_add()函数的额第三个参数是FDEVENT_IN,这是一个宏

/*

* 用于标记文件描述符的状态

*/

#define FDEVENT_IN    BV(0)    //文件描述符是否可写

#define FDEVENT_PRI    BV(1)      //不阻塞的可读高优先级的数据 poll

#define FDEVENT_OUT    BV(2)    //文件描述符是否可读

#define FDEVENT_ERR    BV(3)    //文件描述符是否出错

#define FDEVENT_HUP    BV(4)    //已挂断 poll

#define FDEVENT_NVAL  BV(5)    //描述符不引用一打开文件 poll

其中BV也是一个宏,定义在settings.c文件中:

#define BV(x) (1 << x)

其作用就是将一个整数变量第x位置1,其余为0。

那么上面FDEVENT_XX的宏定义就是定义了一系列者养的整数,通过这些宏的或操作,可以在一个整数中用不同的位表示不同的事件。这些宏和struct epoll_event结构体中的events变量的对应的宏定义对应(有点绕。。。)。说白了就是和epoll.h中的枚举EPOLL_EVENTS对应。

这个函数的主要工作就是设置一些值然后调用epoll_ctl函数。虽然函数的名称是event_add,但是如果第二个参数fde_ndx不等于-1(那肯定就等于后面的参数fd),那这个时候可以肯定fd已经在epoll的监测中了,这时候不再是将fd增加到epoll中,而是修改其要监听的IO事件,就是最后一个参数表示的事件。fdevent_linux_sysepoll_event_add()增加成功后返回fd,在fdevent_event_add中,将这个返回值赋给fde_ndx,所以,fde_ndx==fd。

至此,监听fd的注册流程已经全部结束了,由于当有连接请求是,监听fd的表现是有数据课读,因此,只监听其FDEVENT_IN事件。注册之后,监听fd就开始等待连接请求。

接着,进程执行到了下面的语句:


......本站只呈现部分内容,查看完整文章请到WiFiDog官网社区 http://www.wifidog.pro/2015/04/21/wifidog%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90lighttpd%E4%BD%BF%E7%94%A8-2.html,转载请注明出处

你可能感兴趣的:(wifidog源码分析Lighttpd1.4.20源码分析之fdevent系统(3) -----使用)