Chinaunix首页 | 论坛 | 博客
  • 博客访问: 377002
  • 博文数量: 48
  • 博客积分: 743
  • 博客等级: 上士
  • 技术积分: 956
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-22 13:51
文章分类

全部博文(48)

文章存档

2015年(3)

2014年(17)

2012年(23)

2011年(5)

分类: LINUX

2014-02-13 11:34:07

epoll函数族

Linux I/O多路复用技术)

.函数族成员

点击(此处)折叠或打开

  1. #include <sys/epoll.h>
  2. int epoll_create (int size);
  3. int epoll_create1 (int flags);
  4. int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event);
  5. int epoll_wait (int epfd, struct epoll_event *events, nt maxevents, int timeout);
  6. int epoll_pwait (int epfd, struct epoll_event *events, int maxevents, int timeout, const sigset_t *sigmask);

注:其中epoll_createepoll_ctlepoll_wait使用较频繁。

.各成员介绍

1. epoll_create函数

    函数声明int epoll_create(int size);

    函数说明:该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围(linux2.6.8版本后size参数被忽略,但必须大于0)

    返回值:成功-非负的文件描述符 失败-返回-1 并设置errno

2.epoll_ctl函数

    函数声明int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

    函数说明:该函数用于控制某个文件描述符上的事件,可以注册事件、修改事件、删除事件。

    参数

        epfd:由 epoll_create 生成的epoll专用的文件描述符;

        op:要进行的操作,可能的取值EPOLL_CTL_ADD注册、EPOLL_CTL_MOD修改、EPOLL_CTL_DEL删除;

        fd:关联的文件描述符;

        event:指向epoll_event的指针;

    返回值:成功则返回0,失败则返回-1

:struct epoll_event结构体的定义

点击(此处)折叠或打开

  1. typedef union epoll_data {
  2.            void *ptr;
  3.            int fd;
  4.            uint32_t u32;
  5.            uint64_t u64;
  6. } epoll_data_t;

  7. struct epoll_event {
  8.         uint32_t events; /* Epoll events */
  9.         epoll_data_t data; /* User data variable */
  10.  };

events字段是表示感兴趣的事件和被触发的事件,可能的取值为(或的关系)

    EPOLLIN表示对应的文件描述符可以读;

    EPOLLOUT表示对应的文件描述符可以写;

    EPOLLPRI表示对应的文件描述符有紧急的数据可读;

    EPOLLERR表示对应的文件描述符发生错误(epoll_wait会始终监测,不需设置)

    EPOLLHUP表示对应的文件描述符被挂断(epoll_wait会始终监测,不需设置)

    EPOLLET表示对应的文件描述符有事件发生 ;

    EPOLLONESHOT 表示对应的文件描述符只监测一次;

    EPOLLET表示是ET模式(缺省是LT模式),这是高速工作方式,只支持no-block socket

3.epoll_wait函数

    函数声明int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

    函数说明:该函数用于轮询I/O事件的发生。

    参数

        epfd:由epoll_create 生成的epoll专用的文件描述符;

        epoll_event:用于回传代处理事件的数组;

        maxevents:每次能处理的事件数;

        timeout:等待I/O事件发生的超时值;

    返回值:返回发生事件数。

例:

点击(此处)折叠或打开

  1.            #define MAX_EVENTS 10
  2.            struct epoll_event ev, events[MAX_EVENTS];
  3.            int listen_sock, conn_sock, nfds, epollfd;

  4.            /* Set up listening socket, 'listen_sock' (socket(),bind(), listen()) */

  5.            epollfd = epoll_create(10);
  6.            if (epollfd == -1) {
  7.                perror("epoll_create");
  8.                exit(EXIT_FAILURE);
  9.            }

  10.            ev.events = EPOLLIN;
  11.            ev.data.fd = listen_sock;
  12.            if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
  13.                perror("epoll_ctl: listen_sock");
  14.                exit(EXIT_FAILURE);
  15.            }

  16.            for (;;) {
  17.                nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
  18.                if (nfds == -1) {
  19.                    perror("epoll_pwait");
  20.                    exit(EXIT_FAILURE);
  21.                }

  22.                for (n = 0; n < nfds; ++n) {
  23.                    if (events[n].data.fd == listen_sock) {
  24.                        conn_sock = accept(listen_sock,
  25.                                        (struct sockaddr *) &local, &addrlen);
  26.                        if (conn_sock == -1) {
  27.                            perror("accept");
  28.                            exit(EXIT_FAILURE);
  29.                        }
  30.                        setnonblocking(conn_sock);
  31.                        ev.events = EPOLLIN | EPOLLET;
  32.                        ev.data.fd = conn_sock;
  33.                        if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,&ev) == -1) {
  34.                            perror("epoll_ctl:conn_sock");
  35.                            exit(EXIT_FAILURE);
  36.                        }
  37.                    } else {
  38.                        do_use_fd(events[n].data.fd);
  39.                    }
  40.                }
  41.            }



阅读(938) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~