poll调用

poll函数类似于select,但与select不同的是,poll不是为每个状态(可读、可写、异常)构造一个描述符集,而是构造一个pollfd结构数组。

每个数组元素指定一个描述符标号以及所关心的状态。

struct pollfd {

int fd;

short events;

short revents;

};

events可设置的值见表格。通过这些值告诉内核我们队该描述符关心的是什么。返回是,内核设置revents成员,

用以说明对于这个描述符已经发生了什么。

POLLIN                     有数据可读。
POLLRDNORM        有普通数据可读。
POLLRDBAND         有优先数据可读。
POLLPRI                  有紧迫数据可读。
POLLOUT                写数据不会导致阻塞。
POLLWRNORM       写普通数据不会导致阻塞。
POLLWRBAND        写优先数据不会导致阻塞。
POLLMSG                SIGPOLL消息可用。

此外,revents域中还可能返回下列事件:
POLLER                 指定的文件描述符发生错误。
POLLHUP              指定的文件描述符挂起事件。
POLLNVAL            指定的文件描述符非法。

最后三行是由内核在返回时设置的,即使在events字段中没有指定这三个值,如果相应条件发生(出错了),则在revents中也有返回。

当一个文件描述符挂断了(POLLHUP),就不能再写向该描述符,但是可能从文件描述符中读取到数据。

poll最后一个参数为时间,即愿意等待多久。

 

与select一样,不论一个文件描述符是否阻塞,都不影响poll是否阻塞。

 

poll的使用(伪代码)

#define SIZE 20

#define TIME_OUT 20

所关心的文件描述符为socket;

struct pollfd fds[SIZE];

fds[0].fd = socket;

fds[0].events = POLLIN;

int nfds = 1;

int timeout = TIME_OUT ;

int ret ;

while(1)

{

     ret = poll(fds, nfds, timeout);

     if(ret == 0)

         continue;

     else if(ret < 0)

         exit(0);

     //循环检测所有文件描述符的events发生变化

    for (i = 0; i < nfds; i++)

    {     //通过fd的revents域了解哪些events变化

          if (fds[i].revents == 0)

               continue; 

          if (fds[i].revents != POLLIN) 

               continue; 

           if (fds[i].fd == socket)

           {   //todo}

    }

 } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值