zoukankan      html  css  js  c++  java
  • I/O复用----poll

    2018-08-01 (星期三)
    poll():

    #include <sys/poll.h>
    
    int poll (struct pollfd *fd, unsigned int nfds, int timeout);
    
    struct pollfd {
        int fd;        /* 文件描述符 */
        short events;    /* 所要查看的事件 */
        short revents;    /* 返回所目击的事件 */
    };

    每个pollfd结构可用于指定一个要查看的文件描述符.
    events字段:该文件描述符所要查看事件的位掩码.
    (位掩码是什么?)
    revents字段:该文件描述符所目击事件的位掩码,内核会在返回时设置此字段.events字段中所要求的事件可能会从revents字段返回.有效事件:
       

        POLLIN            有数据可供读取
        POLLRDNORM        有一般数据可供读取
        POLLRDBAND        有优先数据可供读取
        POLLPRI            有紧急数据可供读取
        POLLOUT            写入操作将不受阻挡
        POLLWRNORM        写入一般数据将不受阻挡
        POLLWRBAND        写入优先数据将不受到阻挡
        POLLMSG            有SIGPOLL消息可用


    此外,revents字段可能会返回下列事件:

        POLLER            所指定的文件描述符发生错误
        POLLHUP            所指定的文件描述符发生过去事件
        POLLNVAL        所指定的文件描述符无效


    POLLIN | POLLPRI(有数据,有紧急数据可供读取)等效于select()的读取事件
    POLLOUT | POLLWRBAND(有数据,有紧急数据可供写入)等效于select()的写入事件.
    POLLIN(有数据可供读取) 等效于 POLLRDNORM | POLLRDBAND(有一半数据或优先数据可供读取)
    POLLOUT(写入操作不受阻挡) 等效于POLLWRNORM(写入一般数据不受阻挡)
    timeout参数用来指定等不到就绪IO也要返回的事件.若值为-1,表示无限等待.

    返回值与错误代码
    执行成功时,poll()会返回有目击事件的文件描述符(也就是其结构具有非零的revents字段)的数目;如果在有任何事件在发生之前此调用因逾时而返回,则会返回0,整形失败会返回-1,并将errno设定为下面的其中一个值.
       

        EBADF            在一个过多个结构中指定了无效的文件描述符
        EFAULT            指向fds的指针指向了进程地址空间以外的地方
        EINVAL            nfds参数设定超过了RLIMIT_NOFILE的限制
        ENOMEM内存怒不足以完成这项要求
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/poll.h>
    
    #define TIMEOUT 5        /* poll 的等待时间,以秒为单位 */
    
    int main(void) {
        struct pollfd fds[2];
        int ret;
    
        /* 查看stdin的输入 */
        fds[0].fd = STDIN_FILENO;
        fds[0].events = POLLIN;
    
        /* 查看stdout是否可供写入(通常可以) */
        fds[1].fd = STDOUT_FILENO;
        fds[1].events = POLLOUT;
    
        /* 都设定好了,开始提供服务! */
        ret = poll (fds, 2, TIMEOUT * 100);
        if (ret == -1) {
            perror ("poll");
            return 1;
        }
    
        if (!ret) {
            printf ("%d seconds elapsed.
    ", TIMEOUT);
            return 0;
        }
    
        if (fds[0].revents & POLLIN) {
            printf ("stdin is readable
    ");
        }
    
        if (fds[1].revents & POLLOUT) {
            printf("stdout is writable
    ");
        }
        return 0;
    }
  • 相关阅读:
    第04组(64) 需求分析报告
    第04组(64) 团队展示
    结对编程作业
    Python单元测试框架 Unittest 的简单使用方法
    第一次个人编程作业
    第09组 Alpha冲刺 总结
    Swagger 工具集
    第09组 Alpha冲刺(6/6)
    第09组 Alpha冲刺(5/6)
    第09组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/9404748.html
Copyright © 2011-2022 走看看