一般使用 poll 检测 socket 或标准输入时,只要指定 POLLIN 标志位,就可以检测是否有数据到达,或者连接断开:

 struct pollfd fds[];
fds[].fd = STDIN_FILENO;
fds[].events = POLLIN;
fds[].fd = sock_fd;
fds[].events = POLLIN;
fds[].fd = pipe_fd;
fds[].events = POLLIN;
ret = poll(fds, , -);
if (ret > ) {
if (fds[].revents & POLLIN) {
// handle stdin
...
}
if (fds[].revents & POLLIN) {
// handle socket input
...
}
if (fds[].revents & POLLIN) {
// handle pipe input
...
}
}

当 read 结果返回 0 时表示相应连接断开。

而对于 pipe,只检测POLLIN是感知不到管道断开的,当管道断开时,会在revents设置POLLHUP,必需额外检测此标志位:

 if (pfd[].revents & POLLHUP) {
// handle pipe break
...
}

而当 poll 一个已经关闭的句柄时(句柄号 >=0 有效),poll 本身并不返回错误,而是给对应的句柄事件中设置  POLLNVAL 标志位:

 if (pfd[].revents & POLLNVAL) {
// handle pipe close
...
}

若 poll 一个无效句柄时(句柄号为-1),poll 本身仍不返回错误,但该句柄一定没有任何事件可供检测与返回。因此可用于占位处理,

例如固定从数组某个下标中取出某个句柄时可以在不相关位置设置-1句柄,这样就不用再去判断当前有事件的句柄的源句柄是哪一个了:

 struct pollfd fds[];
fds[].fd = STDIN_FILENO;
fds[].events = POLLIN;
fds[].fd = -;
fds[].events = POLLIN;
fds[].fd = pipe_fd;
fds[].events = POLLIN;
ret = poll(fds, , -);
……

例如当没有 socket  句柄时,该位置保持-1,这样可以不用将管道句柄上移,从而可以固定从fds[2]中取出管道句柄。

当然如果传入 poll 的句柄数组中所有句柄都为无效句柄时,poll仍不返回错误,此时若提供超时,可当成sleep使用;

若不提供超时,则会进入无限期等待……

测试代码

最新文章

  1. ipad互动教学
  2. iOS 10.0 更新点(开发者视角)
  3. POJ 3321 Apple Tree
  4. implement Google's Open Source Slam "Cartographer" demos in ROS/rviz
  5. [置顶] Android系统五大布局详解Layout
  6. 配置 Gitblit 进行 Git 代码管理
  7. linux虚拟机ip地址更改
  8. 开篇-我眼中的FPGA
  9. Proverbs(谚语)
  10. logistics回归理解
  11. 关于下载calipso数据集以及用python将其读到记事本小结
  12. 利用crash 分析软死锁问题【转】
  13. Python基础之函数二
  14. PowerBI发布到网页
  15. mysql插入报主键冲突,解决方法主键索引重新排序
  16. Eclipse 02: 安装spring tool suite插件
  17. blfs(systemv版本)学习笔记-wget的安装与配置
  18. 20165305 实验一: Java开发环境的熟悉
  19. MySQL学习(十三)
  20. 20145319 《网络渗透》web安全基础实践

热门文章

  1. WPF- 模拟触发Touch Events
  2. C++ Boost库简介(一些自己的感受)
  3. JavaScript严格模式分析
  4. Win8Metro(C#)数字图像处理--2.26图像减法
  5. 元素命名空间中的“MvcBuildViews”无效
  6. WPF 添加外部ResourceDirectory
  7. vs2010 编译release没问题debug编译不通过
  8. ADB命令笔记本
  9. [转]Android 如何有效的解决内存泄漏的问题
  10. 从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式(在源码里写非英文,官方推荐“\xE4\xBD...”这种)good