huyc

导航

poll(2)

POLL(2)

NAME

       poll,ppoll —— 等待文件描述符上的事件

SYNOPSIS

#include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

#define _GNU_SOURCE
#include <poll.h>

int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, const sigset_t *sigmask);
DESCRIPTION
poll执行类似于select的任务:等待文件描述符集合中的其中一个准备好I/O。
需要监测的描述符集合由参数fds指定,它是一个格式如下的结构数组:
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
调用者应该在nfds中指定fds数组中项的数量。
fd字段包含一个已打开文件的文件描述符。
events字段是一个输入参数,应用中通常用位模板指定事件。
revents字段是一个输出参数,由内核填写实际遇到的事件。revents可以包含任意events中指定的事件,或是POLLERR、POLLHUP、POLLNVAL三者之一。(这三个位在events中是无意义的,每当对应的条件合适时就会被设置到revents字段)
如果文件描述符集合中任意一个描述符都没有发生其所请求的事件(且没有错误),则poll阻塞直至其中一个事件发生。
timeout参数指定一个poll阻塞的时间上限,单位是毫秒。将timeout指定一个负值意味着无限等待。
可以设置/返回的event和revents的bits定义在<poll.h>:
POLLIN 有数据可读。
POLLPRI
              紧急数据可读(比如,TCP套接字上的带外数据;pseudo-terminal  master  in packet mode has seen state change in slave)。
POLLOUT
              现在写将不会阻塞。
POLLRDHUP (since Linux 2.6.17)
              流套接字的远程端断开连接,或者关闭了写端。要获得此概念要求宏_GNU_SOURCE必须定义。
POLLERR
              错误条件(output only)
POLLHUP
              挂断(output only)
POLLNVAL
              非法请求:fd未打开(output only)
当定义_XOPEN_SOURCE时编译,也会有下面的位,但是并不传递特别的信息:
POLLRDNORM
              等于POLLIN。
POLLRDBAND
              优先级波段数据可读(Linux下基本没用)
POLLWRNORM
              等于POLLOUT。
POLLWRBAND
               优先级数据可写
Linux也能辨认POLLMSG,但是从不使用它。
ppoll()
poll和ppoll的关系类似于select和pselect的关系:犹如pselect,ppoll允许应用安全的等待文件描述符准备好或捕捉到一个信号。
除了timeout参数之外,下面的ppoll调用:
ready = ppoll(&fds, nfds, timeout, &sigmask);
与原子执行下面的调用相同:
sigset_t origmask;

sigprocmask(SIG_SETMASK, &sigmask, &origmask);
ready = poll(&fds, nfds, timeout);
sigprocmask(SIG_SETMASK, &origmask, NULL);
参见pselect的描述以了解ppoll的必要性。
如果sigmask参数指定为NULL,则不执行mask步骤(进而poll和ppoll的唯一差别就只有timeout参数的精度了)
timeout参数指定ppoll阻塞的时间上限。参数是一个指向以下格式的指针:
struct timespec {
long tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
如果timeout指定为NULL,则ppoll无限阻塞。
RETURN VALUE
成功时,返回一个正值;表示revent字段非0的结构数量(换句话说,这些描述符要么报告事件,要么报告错误)。返回0值表示直到调用超时也没有文件描述符准备好。发生错误时,返回-1,并设置对应的errno。
ERRORS
EFAULT 参数给定的数组不在进程地址空间之内。
EINTR  在任一请求事件发生之前遇到信号,参见signal(7)。
EINVAL 指定的nfds值超过RLIMIT_NOFILE值。
ENOMEM 没有分配文件描述符表的内存空间。
VERSIONS
poll系统调用在Linux 2.1.23中介绍。poll库调用在libc 5.4.28中介绍(在内核没有poll系统调用时,作为select的替代方案)
ppoll系统调用在Linux 2.6.16时添加到Linux。ppoll库调用添加到glibc 2.4。
CONFORMING TO
       poll符合规范POSIX.1-2001。ppoll()是Linux特有的。
NOTES
一些实现定义非标准的常量INFTIM,并为其赋值为-1来当做timeout值使用。glibc不提供此常量。
Linux Notes
Linux的ppoll系统调用可以修改它的timeout参数。然而,glibc包装函数通过将本地变量传递给系统调用隐藏了这个行为。因此,glibc的ppoll函数没有改变它的timeout参数。
BUGS
参见select(2)的BUGS区域的有关“伪就绪”的报告的讨论。
SEE ALSO
       select(2), select_tut(2), feature_test_macros(7), time(7)
COLOPHON
       This page is part of release 3.23 of the Linux  man-pages  project.   A
       description  of  the project, and information about reporting bugs, can
       be found at http://www.kernel.org/doc/man-pages/.

posted on 2011-10-23 22:27  huyc  阅读(3191)  评论(0编辑  收藏  举报