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.\n", TIMEOUT);
        return 0;
    }

    if (fds[0].revents & POLLIN) {
        printf ("stdin is readable\n");
    }

    if (fds[1].revents & POLLOUT) {
        printf("stdout is writable\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wuwangchuxin0924/p/9404748.html