首页 > 其他 > 详细

epoll 细节草稿.

时间:2017-02-05 19:32:10      阅读:217      评论:0      收藏:0      [点我收藏+]

1)socket tcp 中,EPOLLIN包括普通数据,connect(syn),close(fin).

2)events 中每条记录只有12字节,如 01 00 00 00 06 00 00 00|00 00 00 00,

数据结构如下.

typedef union epoll_data
{
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;

struct epoll_event
{
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
} __EPOLL_PACKED;

epoll_data是个联合体.所以只算最大的.意思就是这块区域看你自己怎么解读了.取里面不同的数据类型,在同一个内存地址,可以解释为不同的数据类型甚至大小.个人理解.

3)关于 struct epoll_event events[100];

  服务端: 经实验推测,数据由传输层到运用层时,内核根据红黑树,判断是否是注册的事件,如果是,fd加入就绪列表,数据送至fd的缓冲区buff.

  当程序运行到wait,从wait返回,马上根据就绪链表中就绪fd数量,部分重写events指针所在内存,

  所以我们根据就绪事件数量进行处理.注意同一fd,同一事件类型,多次发生,只计算一次.

  当wait后,并正处理事件时,同一fd,同一事件类型,又发生时,根据前面所述,数据会送至fd的缓冲区.所以我们可以获得wait执行之后, 触发事件的io数据.

  而且执行完wait不会在触发它了.个人隐隐感觉很危险啊.可能其中有原子操作吧.

  但是,尽管close和数据都属于epollin.并不会一次处理.会分2次处理.没太深究,应该是fin时,数据是个特殊数据,read或其他函数,会读到他为止,或者就是\eof呢,如

  输入abc回车,输入bcd回车,并按ctrl+d,,,数据在服务断如:  abc\nbcd\n\eof.

  并有一个地方储存上次的返回结果,如size,

  read时候,读到最后一个\n.如果有数据,就返回给size,如果无,检测size是否为-1, 如果不是-1,就返回-1.给size.如果已经是-1.那么试试看是否有\eof.

  纯属猜测.

4)read 会读入\n.

5)清空缓存:

char buffcmd[3];
int cmdlen=read(STDIN_FILENO,buffcmd,2);

//do something.

if(cmdlen>0)//防止eof 的阻塞.避免需要再次输入字符和回车.
{
cin.ignore();
cin.clear();
}

6)所有特殊符号,包括空格,回车,read时,都会认为长度为1.唯独ctrl+D认为是0.

epoll 细节草稿.

原文:http://www.cnblogs.com/lsfv/p/6368346.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!