中国建设部监理工程师查询网站,中国核工业二三建设有限公司太平岭项目部,seo免费系统,wordpress表单打印1.poll的接口介绍 poll系统调用和select类似#xff0c;也是在指定时间内轮询一定数量的文件描述符#xff0c;已测试其中是否有就绪者。poll的原型如下#xff1a; # include poll.h
int poll(struct pollfd*fds,nfds_t nfds,int timeout);
poll系统调用成功返回就… 1.poll的接口介绍 poll系统调用和select类似也是在指定时间内轮询一定数量的文件描述符已测试其中是否有就绪者。poll的原型如下 # include poll.h
int poll(struct pollfd*fds,nfds_t nfds,int timeout);
poll系统调用成功返回就绪文件描述符的总数超时返回0失败返回-1
nfds参数指定被监听事件集合fds的大小。
timeout参数指定poll的超时值单位是毫秒 timeout 为-1 时 poll 调用将永久
阻塞直到某个事件发生 timeout 为 0 时 poll 调用将立即返回。
fds 参数是一个 struct pollfd 结构类型的数组它指定所有用户感兴趣的文件描述
符上发生的可读、可写和异常等事件。 pollfd 结构体定义如下
struct pollfd
{int fd; // 文件描述符short events; // 注册的关注事件类型short revents; // 实际发生的事件类型由内核填充
};
其中 fd 成员指定文件描述符 events 成员告诉 poll 监听 fd 上的哪些事件类型。
它是一系列事件的按位或 revents 成员则有内核修改通知应用程序 fd 上实际发
生了哪些事件。 事件POLLIN描述数据可读 2.epoll的接口介绍 epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、 poll 有很大差异。首 先 epoll 使用一组函数来完成任务而不是单个函数。其次 epoll 把用户关心的文件描述 符上的事件放在内核里的一个事件表中。从而无需像 select 和 poll 那样每次调用都要重复传 入文件描述符或事件集。但 epoll 需要使用一个额外的文件描述符来唯一标识内核中的这 个事件表。 epoll 相关的函数如下 epoll_create()用于床建内核事件表 epoll_ctl()用于操作内核事件表 epoll_wait()用于在一段超时间内等待一组文件描述符上的事件 # include sys/epoll.h
int epoll_create(int size);
//epoll_create()成功返回内核事件表的文件描述符失败返回-1
//size 参数现在并不起作用只是给内核一个提示告诉它事件表需要多大。
//int epoll_ctl(int epfd,int op,int fd,struct epoll_event*event);
epoll_ctl()成功返回 0失败返回-1
//epfd 参数指定要操作的内核事件表的文件描述符
//fd 参数指定要操作的文件描述符
//op 参数指定操作类型EPOLL_CTL_ADD 往内核事件表中注册 fd 上的事件EPOLL_CTL_MOD 修改 fd 上的注册事件EPOLL_CTL_DEL 删除 fd 上的注册事件
//event 参数指定事件它是 epoll_event 结构指针类型
int epoll_wait(int epfd,struct epoll_event*events,int maxevents,int timeout);
//epoll_wait()成功返回就绪的文件描述符的个数失败返回-1抄实返回0
//epfd 参数指定要操作的内核事件表的文件描述符
//events 参数是一个用户数组这个数组仅仅在 epoll_wait 返回时保存内核检测到
的所有就绪事件而不像 select 和 poll 的数组参数那样既用于传入用户注册的事
件又用于输出内核检测到的就绪事件。这就极大地提高了应用程序索引就绪文件
描述符的效率。
//maxevents 参数指定用户数组的大小即指定最多监听多少个事件它必须大于
0
//timeout 参数指定超时时间单位为毫秒如果 timeout 为 0则 epoll_wait 会立即
返回如果 timeout 为-1则 epoll_wait 会一直阻塞直到有事件就绪。 2.1 LT和ET模式 epoll对文件描述符有两种操作模式LT模式和ET模式。LT模式是默认工作模式。当epoll内核事件表中注册一个文件描述符上的EPOLLET事件时epoll将以高效的ET模式来操作该文件描述符。 对于LT模式操作的文件描述符当epoll_wait检测到其上有事物发生并将此事通知应用程序后应用程序可以不立即处理该事物。这样当应用程序下一次调用epoll_wait时还会再次向应用程序通告此事件直到该事件被处理。 对于ET模式操作的文件描述符当epoll_wait检测到其上有事件并将此事件通知应用程序后应用程序必须立即处理该事件因为后续的epoll_wait调用将不再向应用程序通知这一事件。所以ET模式在很大程度上降低了同一个epoll事件被重复触发的次数因此效率该与LT模式。 epoll实现tcp服务器代码如下 设置文件为非阻塞模式 void SetNoWait(int fd)
{int old_optionfcntl(fd,F_GETFL);int new_optionold_option|O_NONBLOCK;fcntl(fd,F_SETFL,new_option);
} 关闭客户端连接 void CloseClient(int epfd, int fd)
{close(fd);if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL) -1){printf(epoll_ctl del error\n);}
} 获取一个新的客户端连接如果 flag 为 ET则以 ET 模式处理此客户端 void GetClientLink(int sockfd, int epfd, int flag)
{struct sockaddr_in caddr;socklen_t len sizeof(caddr);int c accept(sockfd, (struct sockaddr*)caddr, len);if (c 0){printf(Client Link error\n);return;}struct epoll_event ev;ev.data.fd c;if (flag){ev.events EPOLLIN | EPOLLRDHUP | EPOLLET;SetNoWait(c);}else{ev.events EPOLLIN | EPOLLRDHUP;}if (epoll_ctl(epfd, EPOLL_CTL_ADD, c, ev) -1){printf(epoll_ctl add error\n);}}
}