高性能编程之IO复用之Poll

#include<poll.h>

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

fds需要指定所有我们感兴趣的文件描述符,这些socket会发生可读,可写,异常等事件。

struct pllfd

{

    int fd;文件描述符

 short events;注册的事件

short revents;实际发生的事件,由内核填充

};

注册的事件是一系列事件的按位或,revents则由内核修改,以通知fd上发生了哪些事件。

poll支持的事件类型如下:

POLLIN      数据(包括普通数据和优先数据)可读     可作为输入   可作为输出

POLLRANDOM  普通数据可读                          可         可 

POLLRDBAND  优先级带数据可读(Linux不支持)           可         可

POLLPRI     高优先级数据可读,比如TCP带外数据        可         可

POLLOUT     数据(包括普通数据和优先数据)可写        可         可  
POLLWRNORM  普通数据可写                          可         可
POLLWRBAND  优先级带数据可写                       可         可
POLLRDHUP   TCP连接被对方关闭,或者对方关闭了写操作,
            由GNU引入                            可         可
POLLERR     错误                                 否         是
POLLHUP     挂起,比如管道的写端被关闭后,读端描述符上
            将收到POLLHUP事件                     否         是
POLLNVAL    文件描述符没有打开                     否        是

注意:上面有些事件,linux并不完全支持。

注:在POLLERR情形下,可以使用getsockopt获取并清除错误码。

使用POLLRDHUP事件时,我们需要在代码最开始处定义_GNU_SOURCE.

typedef unsigned long int nfds_t;

关于timeout参数:指定poll的超时值,单位是毫秒

为-1时,调用将永远阻塞,直到某个事件发生,当timeout为0时,poll调用将立即返回。

返回值跟select相同




你可能感兴趣的:(linux,服务器,poll)