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.
原文:http://www.cnblogs.com/lsfv/p/6368346.html