c++应用网络编程之十Linux下的Poll模式-三、数据结构和API

时间:2024-10-02 14:48:37

poll的数据结构也不复杂,看一下其相关代码:

#define POLLIN		0x0001     //普通或优先级带数据可读
#define POLLPRI		0x0002     //高优先级数据可读
#define POLLOUT		0x0004     //普通数据可写
#define POLLERR		0x0008     //错误
#define POLLHUP		0x0010     //挂起
#define POLLNVAL	0x0020     //描述字不是一个打开的文件

/* The rest seem to be more-or-less nonstandard. Check them! */
#define POLLRDNORM	0x0040  //普通数据可读
#define POLLRDBAND	0x0080  //优先级带数据可读
#ifndef POLLWRNORM
#define POLLWRNORM	0x0100     //普通数据可写
#endif
#ifndef POLLWRBAND
#define POLLWRBAND	0x0200     //优先级带数据可写
#endif
#ifndef POLLMSG
#define POLLMSG		0x0400
#endif
#ifndef POLLREMOVE
#define POLLREMOVE	0x1000
#endif
#ifndef POLLRDHUP
#define POLLRDHUP       0x2000
#endif

#define POLLFREE	(__force __poll_t)0x4000

#define POLL_BUSY_LOOP	(__force __poll_t)0x8000

struct pollfd {
	int fd;//监听的文件描述符
	short events;//该文件描述符的事件掩码,开发者设置
	short revents;//文件描述符的操作结果事件掩码,内核在调用返回时设置
};

一个pollfd对象代表着一个监听的文件描述符即Socket。如果需要监听多个Socket则需要创建一个pollfd对象数组通过接口函数poll进行处理。如果需要监听多类事件,则需要使用类似POLLIN | POLLRDNORM设置pollfd对象中events域。之后可以在调用poll接口后使用类似fds[i].revents & POLLIN的方法来检测相关事件是否发生,如果发生则可以进行相关事件的操作。