服务端采用epoll ET模式,当有请求过来,epoll_wait会告知有数据可读,因此进行
读操作(ET下,这里是一次性读完吗?,如果读取数据很大,那岂不是效率低了?),
同时进行数据处理; 我不明白的是,应该在什么地方关注该fd的写事件---即哪里写
epoll_ctl(epfd, EPOLL_OUT, fd, events) ?
epoll的事件触发,EPOLL_IN比较懂,有数据传入,epoll_wait告知; 那EPOLL_OUT呢,我明白在发送缓冲区可写时,会触发EPOLL_OUT,但是这怎么跟服务器的设计联系起来呢?
http://blog.csdn.net/wangxiaoqin00007/article/details/13017413
epoll_wait每次只对就绪队列(rdlist)进行检查,如果发现就绪队列(rdlist)不为空,将当前进城设置为就绪,下来将rdlist里的fd挪到另一个队列里(txlist),rdlist清空,将txlist里的fd拷贝到用户空间。对于lt模式来说,有fd事件没有处理完,就将txlist相应的fd写回到rdlist里以便下次还能从rdlist里发现它。
ET模式下只通知用户一次,用户必须一次性读完数据,而且ET模式必须采用非阻塞读或写。如果处理事件逻辑比较复杂,建议起个线程去处。你想要关注某个fd的事件,不论读或写,提前将它们加入内核时间表就行了,等有该fd上的这类事件发生时,就会通知用户。具体设计视情况而定。