轮询子例程

用途

检查多个文件描述符和消息队列的 I/O 状态。

标准 C 库 (libc.a)

语法

#include <sys/poll.h>
#include <sys/select.h>
#include <sys/types.h>
int poll( ListPointer Nfdsmsgs Timeout)
void *ListPointer;
unsigned long Nfdsmsgs;
long Timeout;

描述

轮询子程序检查指定的文件描述符和消息队列,查看它们是否已准备好读取(接收)或写入(发送),或查看它们是否有异常情况待处理。 尽管有OPEN_MAX数量的文件描述符可用,但该子程序只能访问FD_SETSIZE数量的文件描述符。

注意: 轮询子程序仅适用于字符设备、管道、消息队列和套接字。 并非所有字符设备驱动程序都支持此操作。 有关特定设备驱动程序是否以及如何支持轮询选择子程序的信息,请参阅各个字符设备的说明。

为了与本操作系统以前的版本和 BSD 系统兼容,还支持选择子程序。

If a program needs to use message queue support, the program source code should be compiled with the -D_MSGQSUPPORT compilation flag.

参数

描述
ListPointer 指定指向 "pollfd结构数组、"民调结构数组或民调专家结构数组的指针。 每个结构指定文件描述符或消息队列标识以及此文件或消息队列的相关事件。 pollfd pollmsg pollist结构在/usr/include/sys/poll.h文件中定义。 如果要使用轮询器结构,应在用户程序中定义一个类似于下面的结构。 pollfd结构必须位于pollmsg结构之前。
struct pollist {
   struct pollfd fds[3];
   struct pollmsg msgs[2];
   } list;

该结构的初始化过程如下:

list.fds[0].fd = file_descriptorA;
list.fds[0].events = requested_events;
list.msgs[0].msgid = message_id;
list.msgs[0].events = requested_events;

fds信息数组中的其他元素也可以用同样的方法初始化。 然后可以调用轮询子程序,如下所示:

nfds = 3;   /* number of pollfd structs */
nmsgs = 2;   /* number of pollmsg structs */
timeout = 1000   /* number of milliseconds to timeout */
poll(&list, (nmsgs<<16)|(nfds), 1000);

The exact number of elements in the fds and 信息 arrays must be used in the calculation of the Nfdsmsgs parameter.

Nfdsmsgs 指定要检查的文件描述符数和确切消息队列数。 低阶 16 位给出pollfd结构数组中元素的个数,而高阶 16 位则给出 pollmsg结构数组中元素的确切个数。 如果Nfdsmsgs参数的一半等于 0,则假定相应数组不存在。
超时 指定等待至少一个指定事件发生的最大时间长度 (以毫秒为单位)。 如果超时参数值为-1,轮询子程序将在至少一个指定事件发生后才返回。 如果超时参数值为 0,则轮询子程序不会等待事件发生,而是立即返回,即使指定的事件都没有发生。

轮询子例程 STREAMS 扩展

除上述功能外,轮询子程序还通过一组引用开放流的文件描述符多路复用输入/输出。轮询子程序可识别可发送或接收信息的流,或发生特定事件的流。

您可以使用read子程序或getmsg系统调用来接收信息。您可以使用子程序或putmsg系统调用发送信息。某些streamio操作,如I_RECVFDI_SENDFD也可用于发送和接收信息。 请参阅streamio操作。

ListPointer参数指定要检查的文件描述符以及每个文件描述符的相关事件。 它指向一个数组,对于每个感兴趣的打开文件描述符,该数组都有一个元素。 数组元素为pollfd结构。 除了 /我们/包括/系统/poll.h文件中的 "pollfd结构外,STREAMS 还支持以下成员:

int fd;             /*  file descriptor  */ short events;       /* requested events */ short revents;      /* returned events  */

fd字段指定了一个打开的文件描述符,而eventsrevents字段是由以下事件标志的任意组合构成的位掩码:

描述
波林 流头读队列上存在非优先级或文件描述符传递消息。 即使消息的长度为 0 ,也会设置此标志。 在revents字段,该标志与POLLPRI标志互斥。 请参阅I_RECVFD命令。
POLLRDNORM 在流头读队列上存在非优先级消息。
POLLRDBAND 流头读取队列中有优先级信息(带 > 0)。
波利普里 在流头读队列上存在高优先级消息。 即使消息的长度为 0 ,也会设置此标志。 在revents字段,该标志与POLLIN标志互斥。
投票站 流中的第一个下游写队列未填满。 可以随时发送正常优先级消息。 参见putmsg系统调用。
POLLWRNORM POLLOUT 相同。
POLLWRBAND 下游存在一个大于 0 的优先级带,可以随时发送优先级信息。
POLLMSG 包含SIGPOLL信号的报文已到达流头读取队列的前端。

返回值

成功完成后, 轮询子程序会返回一个值,表示满足选择标准的文件描述符和消息队列的总数。 返回值与Nfdsmsgs参数类似,低阶 16 位给出的是文件描述符的数量,高阶 16 位给出的是非零的消息队列标识符的数量revents具有有效值。 可以使用sys/select.h文件中的NFDSNMSGS宏将这两个值从返回值中分离出来。 NFDS宏返回NFDS#,其中返回的数字表示报告某些事件或错误的文件数;NMSGS宏返回NMSGS#,其中返回的数字表示报告某些事件或错误的消息队列数。

值为 0 表示 轮询子程序超时,并且没有任何指定文件或报文队列显示存在事件(所有revents字段的值为 0)。

如果不成功,则返回值为-1并设置全局变量errno以指示错误。

错误代码

如果以下一项或多项为真,则轮询子程序无法成功运行:

描述
EAGAIN 内部数据结构分配失败。
EINTR 轮询系统调用过程中捕获了一个信号,安装信号处理器时提示不得重启子程序。
EINVAL Nfdsmsgs参数指定的pollfd结构数大于FD_SETSIZE。 如果Nfdsmsgs参数指定的 pollmsg结构数大于允许的最大消息队列数,也会返回此错误。
EFAULT ListPointer参数与Nfdsmsgs参数结合使用,可寻址进程已分配地址空间之外的位置。