socket编程中poll怎么使用
socket编程中poll怎么使用
这篇文章主要介绍“socket编程中poll怎么使用”,在日常操作中,相信很多人在socket编程中poll怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”socket编程中poll怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一. 关于poll
对于IO复用模型,其优点无疑是免去了对一个个IO事件就绪的等待,转而代之的是同时对多个IO数据的检测,当检测等待的事件中至少有一个就绪的时候,就会返回告诉用户进程“已经有数据准备好了,快看看是哪个赶紧处理”,而对于IO复用的实现,除了可以用select函数,另外一个函数仍然支持这种复用IO模型,就是poll函数;
二. poll函数的用法
虽然同样是对多个IO事件进行检测等待,但poll和select多少还是有些不同的:
函数参数中,
先来说nfds,这个是指当前需要关心的文件描述符的个数;
timeout同样是设置超时时间,只是和select的timeout是一个结构体不一样,这里只是一个整型类型,且含义是毫秒;
而fds是一个结构体指针,如下:
结构体中,
fd表示所要关心的文件描述符;
events表示该文件描述符所关心的事件,这是一个输入型参数,要告诉操作系统这个文件描述符对应的事件所关心的操作事件是什么,比如读或写;
revents是一个输出型参数,表示当poll返回时告诉用户什么操作事件是就绪的,比如如果POLLIN是就绪的,那么返回时revent的值就是POLLIN,告诉用户fd事件的POLLIN是就绪的;
events和revents的值可以为如下:
选项其实不止这三个,只是这里的讨论中这三个选项是最常用的;
events设置为POLLIN表示fd所需要读取数据,而revents若返回POLLIN则表示data已经ready可以读取了;
同样,events设置为POLLOUT表示fd所关心数据的写入,而revents返回POLLOUT则表示写事件就绪可以进行数据的写入;
至于POLLPRI,后面的解释是作为紧急选项来设置的,在TCP协议报文中有个URG的紧急指针是表示先从紧急数据的地方开始读取,这里也是这个意思;
与select不同的是,reads与writes是输入输出参数,我上一篇博客中设置中:
else if(fds[i] > 0 && FD_ISSET(fds[i],&reads)) //正常事件,但是是非监听时间,也就代表时新建立的new_sock。 { // char buf[1024]; ssize_t s = read(fds[i],buf,sizeof(buf) -1); if(s > 0) { buf[s] = '