poll函数与select函数差不多
函数原型:
struct pollfd的构造如下:
每个pollfd构造体指定了一个被监视的文件描写符。
? ? ? 第一个参数是一个数组,即poll函数能够监视多个文件描写符。每个构造体的events是监视该文件描写符的事件掩码,由用户来设置。revents是文件描写符的垄断收获事件,内核在调用归来时设置。events中心求的任何事件都可能在revents中归来。合法的事件如下:
后三个只能作为描写字的归来收获存储在revents中,而不能作为测验条件用于events中。
这些事件在events域中无意义,因为它们在轻便的时候总是会从revents中归来。利用poll()和select()不一样,你无须要显式地哀求异常情形报告。
? ? ? ?POLLIN | POLLPRI等价于select()的读事件,POLLOUT |POLLWRBAND等价于select()的写事件。POLLIN等价? POLLRDNORM |POLLRDBAND,而POLLOUT则等价于POLLWRNORM。
? ? ? ? 例如,要同时监视一个文件描写符是否可读和可写,我们能够设置 events为POLLIN |POLLOUT。在poll归来时,我们能够察看revents中的符号,对应于文件描写符哀求的events构造体。万一POLLIN事件被设置,则文件描写符能够被读取而不阻塞。万一POLLOUT被设置,则文件描写符能够写入而不导致阻塞。这些符号并不是互斥的:它们可能被同时设置,表示这个文件描写符的读取和写入垄断都会正常归来而不阻塞。
第二个参数nfds:要监视的描写符的数目。
timeout参数指定期待的毫秒数,无论I/O是否准备好,poll都会归来。timeout指定为负数值表示无限超时;timeout为0指示poll调用即刻归来并列泄准备好I/O的文件描写符,但并不期待其它的事件。这种情形下,poll()就像它的名字那样,一旦评比出来,即刻归来。
获胜时,poll()归来构造体中revents域不为0的文件描写符个数;万一在超时前未曾任何事件发生,poll()归来0;失利时,poll()归来-1,并设置errno为下列值之一:
EBADF:一个或多个构造体中指定的文件描写符无效。
EFAULT:fds指针指向的地址超过历程的地址空间。
EINTR:哀求的事件之前发生一个信号,调用能够重新发动。
EINVAL:nfds参数超过PLIMIT_NOFILE值。
ENOMEM:可用内存不足,无法告终哀求。