poll,ppoll

poll, ppoll - 等待文件描述符的一些事件
SYNOPSIS
       #include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

#define _GNU_SOURCE         /* See feature_test_macros(7) */
       #include <signal.h>
       #include <poll.h>

int ppoll(struct pollfd *fds, nfds_t nfds,
               const struct timespec *timeout_ts, const sigset_t *sigmask);

DESCRIPTION
       poll() 类似于select,等待一组文件描述符直到I/O处于可用状态
       
       这组文件描述符是fds数组传入的,成员结构如下:
           struct pollfd {
               int   fd;         /* 文件描述符 */
               short events;     /* 请求事件 */
               short revents;    /* 返回事件 */
           };
        调用者必须通过nfds参数指出fds数组成员的个数.
        
        fd是已经打开的文件的文件描述符,如果fd不可用,或者是非法的,在结构中给出的events会被忽略,同时revents返回0(这样做提供了一个在调用poll函数时忽略文件描述符的简单方法.(使文件描述符无效,就可以在poll的时候忽略掉该fds成员的监控,注意:不能把fd设置成0); 
        
        events:是一个输入型参数,每个bit位指定一个和fd相关的事件,events可以是0,当events是0的时候,revents只能返回三种事件POLLHUP, POLLERR, POLLNVAL.

revents:是一个输出型参数,内核根据实际发生的事件来填写revents,revents可以返回任何一个在events中填写的事件,或者是POLLERR, POLLHUP, POLLNVAL中的一个.
       
        如果所有fds中的数组成员指定的events中请求的事件都没有发生,poll()将一直阻塞,直到有事件发生.
        
        timeout:指定在没有事件发生时,可以阻塞多少毫秒(ms).
        
        注意:由于每个系统的系统时钟的问题,实际阻塞的时间可能会超出timeout指定的时间. 如果设置timeout为负值,意味着poll将一直等待下去,直到事件发生.如果设置为0,poll会立即返回,不管事件是否发生和.
        
        在events和revents中的bit位定义在<poll.h>中
                
              POLLIN 
                    有数据可读
              POLLPRI
                    有紧急的数据要读.(通过send可以设置收取的是否为紧急数据)
                    http://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch24lev1sec2.html
              POLLOUT
                    可以写入,但如果没有把fd设置成O_NONBLOCK,较大的数据将会继续阻塞.
              POLLRDHUP (since Linux 2.6.17)
                    socket链接的对端关闭了链接,或者是链接异常.
              POLLERR
                    poll函数异常
              POLLHUP
                    poll函数挂起
              POLLNVAL
                    fd没有打开.(socket或者文件没有被打开,或者不存在)

在编译时定义了 _XOPEN_SOURCE, 会有下面的事件

POLLRDNORM
                    等同于POLLIN
                    
              POLLWRNORM
                    等同于POLLOUT
              POLLWRBAND
                    优先数据可以写入

ppoll()
        poll和ppoll很相似,就像select和pselect.ppoll允许程序安全的等待,直到文件描述符已经准备好了,或者捕捉到一个退出的信号.

在timeout参数上,ppoll比poll精确.
           ready = ppoll(&fds, nfds, timeout_ts, &sigmask);
        上面的函数函数调用相当于执行下面的代码:

sigset_t origmask;
           int timeout;

timeout = (timeout_ts == NULL) ? -1 :
                     (timeout_ts.tv_sec * 1000 + timeout_ts.tv_nsec / 1000000);
           sigprocmask(SIG_SETMASK, &sigmask, &origmask);
           ready = poll(&fds, nfds, timeout);
           sigprocmask(SIG_SETMASK, &origmask, NULL);

查看pselect,理解ppoll为什么是首选.

如果sigmask参数是NULL, ppoll不会监控任何事件,和poll唯一的区别就是timeout参数.

timeout_ts参数给出一个ppoll阻塞的上限时间.timeout_ts是一个指针,timeout_ts的结构如下:
           struct timespec {
               long    tv_sec;         /* seconds */
               long    tv_nsec;        /* nanoseconds */
           };

timeout_ts如果是NULL,ppoll将一直阻塞到事件发生.
RETURN VALUE
        成功:返回一个正数,返回值为非0的revents的位数.如果返回0,表示ppoll是超时返回.
        错误:返回-1,并且会设置系统的errno.
ERRORS
       EFAULT The array given as argument was not contained in the calling program's address space.
                数组参数不可用
       EINTR  A signal occurred before any requested event; see signal(7).
                捕捉到特殊的信号,具体的信号请查看signal手册.
       EINVAL The nfds value exceeds the RLIMIT_NOFILE value.
                nfds的数组大小超出了RLIMIT_NOFILE
       ENOMEM There was no space to allocate file descriptor tables.
                没有空间用于创建文件描述符表
VERSIONS
        poll函数在2.1.23之后提供的,在老的内核中没有poll系统调用.在之前的版本可用使用select.
        
CONFORMING TO
        poll遵循POSIX.1-2001,ppoll是linux引入的
NOTES
        某些版本会定义非标准的常量INFTIM = -1,用于poll的timeout参数, 在glibc中不支持INFTIM常量.

poll,ppoll相关推荐

  1. poll, ppoll

    poll,ppoll poll, ppoll - 等待文件描述符的一些事件 SYNOPSIS        #include <poll.h> int poll(struct pollfd ...

  2. Linux系统编程——I/O多路复用select、poll、epoll

    参考:https://segmentfault.com/a/1190000003063859 Linux下的I/O复用与epoll详解:https://www.cnblogs.com/lojunren ...

  3. 20150218【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

    [改进Poll定时查询]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 按键驱动程序中,如果不使用read函数中使程序休眠的,而是还是使用查询方式的话,可以使用 ...

  4. 问题集锦(16-20)

    Problem 16. What's the difference between soft link and hard link file? Ans: Hard link file is nothi ...

  5. Linux网络编程--文件描述符

    文件描述符 在Unix和Unix-like操作系统中,文件描述符(file descriptor, FD)是一个文件或者像pipe或者network socket等之类的输入/输出源的唯一标识. 文件 ...

  6. httpServer / proxyServer / nginx 1.7.9

    http://photofile.su****.com/NginxStatus Active connections: 4 server accepts handled requests1844751 ...

  7. Kubernetes CKS【24】---System Hardening - Kernel Hardening Tools(seccomp)

    文章目录 1. Seccomp介绍 2. 目标 3. Seccomp for Docker Nginx 4. 启用 RuntimeDefault 5. 创建 Seccomp 文件 6. Kind 创建 ...

  8. 一个程序员的Java和C++学习之路(整理)

    转载:http://blog.csdn.net/ajian005/article/details/8003655 Java学习之路 一直有这么个想法,列一下我个人认为在学习和使用Java过程中可以推荐 ...

  9. 【转】一个程序员的Java和C++学习之路(整理)

    经典编程书籍大全:  http://blog.jobbole.com/106093/  https://github.com/jobbole/awesome-programming-books Jav ...

最新文章

  1. ThomasGDietterich_MachineLearning_personalSite
  2. Android SDK在线更新镜像服务器
  3. Fragment创建添加切换和对应底部导航(二)
  4. 4-1 线程安全性-原子性-atomic-1
  5. [Codeforces Round #195 (Div. 2)] A. Vasily the Bear and Triangle
  6. 李开复对谈硅谷传奇:杨致远敦促AI交产品,马尔科夫说无人车3年没戏
  7. 2016计算机一级成绩,2016年江苏计算机一级成绩查询_无忧考网.docx
  8. 运营人员消消气,这个工具让数据分析轻松驾驭
  9. After Effects - Bodymovin 插件验货及感受
  10. MySQL-性能优化
  11. injected stylesheet 导致页面样式异常
  12. 吹牛前请看这篇:“智能”物流 VS “智慧”物流
  13. CSDN上一个非常搞笑的帖子内容---一个让我瞠目结舌的电脑高手
  14. C语言进阶(牟海军)
  15. ERP主要软件品牌对比
  16. Vue报错------did you register the component correctly? For recursive components, make sure to provide
  17. 开机出现 NTLDR is Missing 的解决方法
  18. python中title函数有什么用_Python title()字符串处理函数的使用
  19. linux使用sed替换中文字符
  20. Lrc2021 Lightroom Classic

热门文章

  1. Chrome浏览器设置护眼模式(离线安装插件)
  2. 基于android的互动健身平台,基于Android的健身助手APP设计与实现
  3. 【Linux】基础:进程的概念
  4. 在Ubuntu 18下安装SIMULIA Abaqus 2020
  5. 程序员真实从零开始实操 赚钱渠道之一CPS
  6. Python Excel的使用2
  7. 图钉能按到墙上吗_图钉怎么钉在墙上
  8. EASYOPS系列|《凤凰项目》用几百案例解释DevOps
  9. 知识图谱与推荐系统之《Multi-Task Feature Learning for Knowledge Graph Enhanced Recommendation》MKR
  10. vue canvas画框调大小