epoll简单使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxt_1/article/details/87706938

epoll把用户关心对文件描述符上的事件放在内核里的一个事件表中,使用一个文件描述符(epoll_create的返回值)来唯一标识内核中的这个事件表。

1.int epoll_create(int size)

	创建事件表。
	size:
		事件表大小

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

	op:
		EPOLL_CTL_ADD
		EPOLL_CTL_MOD
		EPOLL_CTL_DEL
	
	struct epoll_event
	{
		_uint32_t events;
		epoll_data_t data;
	};

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

注:
epoll_data_t是一个联合体,其中fd是使用最多的。不能同时使用其ptr成员和fd成员,如果要将文件描述符和用户数据关联起来,放弃使用epoll_data_t的fd成员,在ptr指向的用户数据中包含fd。

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

	如果检测到事件,就将所有就绪的事件从内核事件表中复制到第二个参数events指向的数组中。

4. LT、ET模式

  • LT模式:(level trigger,水平触发)

采用LT模式的文件描述符,当epoll_wait检测到有事件发生并将此事件通知给应用程序后,应用程序可以不立即处理改事件
当应用程序下一次调用epoll_wait时,epoll_wait还会再次向应用程序通知此事件,直到该事件被处理。

  • ET模式:(edge trigger,边沿触发)
    采用ET模式的文件描述符,当epoll_wait检测到有事件发生并将此事件通知应用程序后,应用程序必须立即处理该事件
    ET模式在很大程度上降低了同一个epoll事件被重复触发的次数。
注:使用ET模式的文件描述符应该是非阻塞的。
因为在ET模式下,触发事件必须立即处理,若文件描述符是阻塞的,那么读或写操作将会因为没有后续的事件一直处于阻塞状态。

猜你喜欢

转载自blog.csdn.net/zxt_1/article/details/87706938
今日推荐