POLL笔记
函数原型
1 |
|
参数:
fds:一个pollfd结构体数组指针,用于描述需要等待的事件,每个数组中包含一个文件描述符
nfds:fd 数组的大小,即需要等待的事件的数量
timeout:等待事件发生的时间,以毫秒为单位。如果为 -1,表示一直等待,直到有事件发生。如果为 0,表示不阻塞,立即返回。
返回值:如果有事件发生,返回值为正数,表示有多少个文件描述符发生了事件,超时则返回0,错误返回值为 -1。
struct pollfd
的结构体:
1 | struct pollfd{ |
fd:要监视的文件描述符,如果fd无效的话那么events监视事件也无效,并且revents返回0.
event:表示要监视的事件,可以监视的事件如下(不全):
事件名 描述 POLLIN 输入数据可读 POLLOUT 输出缓冲区有空闲空间,可以写入数据 POLLHUP 有指定的文件描述符挂起 POLLPRI 输入数据有紧急数据可读(比如带外数据) POLLNVAL 无效的文件描述符 POLLRDNORM 同 POLLIN revents :返回的事件,由linux内核设置具体的返回事件
使用 poll 函数来等待标准输入(键盘输入)和一个文件描述符的变化
初始化 pollfd 结构体:
fds[0] 用于标准输入(STDIN_FILENO),关心可读事件(POLLIN)。
fds[1] 用于打开的文件描述符,也关心可读事件(POLLIN)。调用 poll 函数:
使用 while (1) 循环来持续调用 poll,以便持续监测文件描述符的状态。
poll(fds, 2, 5000) 表示等待 fds 数组中的两个文件描述符在 5000 毫秒内变得可读。
如果返回值为 -1,表示发生错误。
如果返回值为 0,表示超时。
如果返回值为正数,表示有文件描述符发生了事件。处理事件:
检查 fds[0].revents 和 fds[1].revents,判断哪些文件描述符发生了事件。
如果文件描述符可读,读取数据并打印。
如果文件描述符对端关闭连接或发生错误,打印相应的信息。
完整代码
1 |
|