Linux杂谈:Epoll简介

Posted Stoneshen1211

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux杂谈:Epoll简介相关的知识,希望对你有一定的参考价值。

在前面简单介绍了select的使用方法,但是select也有一些缺点,因此2.6内核引入了epoll,优化了select的性能问题。

1 epoll_create

函数原型:

 #include <sys/epoll.h>

   int epoll_create(int size);

此函数用来创建一个epoll的句柄,size用于告诉内核需要监听的数目一共有多大。

2 epoll_ctl

函数原型:

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

参数:

2.1 epfd

为epoll_create的返回值

2.2 op

表示动作,主要有以下三个宏:

EPOLL_CTL_ADD  注册新的文件描述符到edfd中去
EPOLL_CTL_MOD 修改文件描述符event信息
EPOLL_CTL_DEL 从edfd中删除注册的文件描述符

2.3 event

event结构体包含了此文件描述符需要监听的事件以及用户私有数据,结构体如下:

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 */
;

上面的events表示要监听的事件,主要有以下几个值:

EPOLLIN 可读
EPOLLOUT 可写
EPOLLRDHUP 对端断开连接
EPOLLPRI 有紧急数据要读
EPOLLERR 出错
EPOLLHUP 文件被挂起
EPOLLET 设置为边缘触发模式,默认水平触发模式
EPOLLONESHOT(Linux 2.6.2以上版本)只监听一次事件,当需要再次监听时,需要重新加入epoll中,使用EPOLL_CTL_MOD添加新的事件

data为用户私有的数据,可以在里面填充自己需要的数据,当有事件触发时,返回的events也会携带同样的数据。

3 epoll_wait

函数原型:

int epoll_wait(int epfd, struct epoll_event *events,
                      int maxevents, int timeout);

3.1 epfd

为epoll_create的返回值。

3.2 events

表示从内核得到的事件的集合,当监听到事件之后,会将对应的信息赋值给events并返回。

3.3 maxevents

最大的events事件数量。

3.4 timeout

超时时间,单位ms

4 示例

int test()

	int s32EventsMax = 10;
	int s32FD1 = 17;  //文件描述符1 此处demo写为固定值
	int s32FD2 = 18;  //文件描述符2 此处demo写为固定值
	struct epoll_event stEv;	
	struct epoll_event stEvents[s32EventsMax];
	int s32EpollFd = 0;
	int s32FdsNum = 0;
	int i = 0;

	s32EpollFd = epoll_create(s32EventsMax); //创建句柄
	if (s32EpollFd == -1) 
	
		printf("epoll_create \\n");
		return -1;
	

	stEv.events = EPOLLIN;  //可读
	stEv.data.fd = s32FD1;
	if (epoll_ctl(s32EpollFd, EPOLL_CTL_ADD, s32FD1, &ev) == -1) 
	
	   printf("epoll_ctl: s32FD1\\n");
	   return -1;
	
	
	stEv.events = EPOLLIN;  //可读
	stEv.data.fd = s32FD2;
	if (epoll_ctl(s32EpollFd, EPOLL_CTL_ADD, s32FD2, &ev) == -1) 
	
	   printf("epoll_ctl: s32FD2\\n");
	   return -1;
	
	
	while(1) 
	
		s32FdsNum = epoll_wait(s32EpollFd, stEvents, s32EventsMax, -1);
		if (s32FdsNum == -1) 
			printf("epoll_wait\\n");
			return -1;
		

		for (i = 0; i < nfds; ++i) 
		
			if (stEvents[n].data.fd == s32FD1) 
			
				//do something...
			
			else if (stEvents[n].data.fd == s32FD2) 
			
				//do something...
			
		
	
	
	return 0;

以上是关于Linux杂谈:Epoll简介的主要内容,如果未能解决你的问题,请参考以下文章

Linux杂谈:Epoll简介

Linux杂谈:Select简介

Linux杂谈:Select简介

Linux杂谈:Select简介

Linux杂谈:ulimit简介

Linux杂谈:ulimit简介