poll()函数详解

2023-11-18

poll提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息。

  #include <poll.h>

  int poll(struct pollfd fd[], nfds_t nfds, int timeout);

    参数:

   1)第一个参数:一个结构数组,struct pollfd结构如下:

  struct pollfd{

  int fd;              //文件描述符

  short events;    //请求的事件

  short revents;   //返回的事件

  };

  events和revents是通过对代表各种事件的标志进行逻辑或运算构建而成的。events包括要监视的事件,poll用已经发生的事件填充revents。poll函数通过在revents中设置标志肌肤POLLHUP、POLLERR和POLLNVAL来反映相关条件的存在。不需要在events中对于这些标志符相关的比特位进行设置。如果fd小于0, 则events字段被忽略,而revents被置为0.标准中没有说明如何处理文件结束。文件结束可以通过revents的标识符POLLHUN或返回0字节的常规读操作来传达。即使POLLIN或POLLRDNORM指出还有数据要读,POLLHUP也可能会被设置。因此,应该在错误检验之前处理正常的读操作。

poll函数的事件标志符值

常量 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 发生挂起
POLLNVAL 描述字不是一个打开的文件

 

  注意:后三个只能作为描述字的返回结果存储在revents中,而不能作为测试条件用于events中。

  2)第二个参数nfds:要监视的描述符的数目。

  3)最后一个参数timeout:是一个用毫秒表示的时间,是指定poll在返回前没有接收事件时应该等待的时间。如果  它的值为-1,poll就永远都不会超时。如果整数值为32个比特,那么最大的超时周期大约是30分钟。

 

timeout值 说明
INFTIM 永远等待
0 立即返回,不阻塞进程
>0 等待指定数目的毫秒数


例子程序: 

在/root/pro/fd1 /root/pro/fd2中分别有内容,

1234

5678

1122

3344

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <stropts.h>
#include <sys/poll.h>
#include <sys/stropts.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <poll.h>

#define BUFSIZE 1024

int main(int argc, char *argv[])
{
    char buf[BUFSIZE];
    int bytes;
    struct pollfd *pollfd;
    int i=0;
    int nummonitor=0;
    int numready;
    int errno;
    char *str;
    if(argc != 3)
    {
        fprintf(stderr,"Usage:the argc num error\n");
        exit(1);
    }


    if((pollfd = (struct pollfd*)calloc(2, sizeof(struct pollfd))) == NULL) //为struct pollfd分配空间
           exit(1);
         for(i; i<2; i++) //初始化化struct pollfd结构
    {
        str = (char*)malloc(14*sizeof(char));        
        memcpy(str,"/root/pro/",14); 
        strcat(str,argv[i+1]);//注意,需要把路劲信息放到str中,否则opne("/root/pro/argv[i]",O_RDONLY)会出错
        printf("str=%s\n",str);//原因在于,在” “之中的argv[i]是字符串,不会用变量代替argv[i].
        (pollfd+i)->fd = open(str,O_RDONLY);
        if((pollfd+i)->fd >= 0)
        fprintf(stderr, "open (pollfd+%d)->fd:%s\n", i, argv[i+1]); 
        nummonitor++;
        (pollfd+i)->events = POLLIN;
    }
    printf("nummonitor=%d\n",nummonitor);
      
    while(nummonitor > 0)
    {
        numready = poll(pollfd, 2, -1);
        if ((numready == -1) && (errno == EINTR))
            continue;        //被信号中断,继续等待
        else if (numready == -1)
            break; //poll真正错误,推出
        printf("numready=%d\n",numready);
        for (i=0;nummonitor>0 && numready>0; i++)
        {
            if((pollfd+i)->revents & POLLIN)
            {
                
                 bytes = read(pollfd[i].fd, buf, BUFSIZE);
                numready--;
                printf("pollfd[%d]->fd read buf:\n%s \n", i, buf);
                nummonitor--;
            }
        }
    }
    for(i=0; i<nummonitor; i++)
        close(pollfd[i].fd);
    free(pollfd);
    return 0;
}

输出结果:




        


FROM: http://blog.csdn.net/djinglan/article/details/8302938



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

poll()函数详解 的相关文章

  • linux AIO (异步IO) 那点事儿

    在高性能的服务器编程中 IO 模型理所当然的是重中之重 需要谨慎选型的 对于网络套接字 我们可以采用epoll 的方式来轮询 尽管epoll也有一些缺陷 但总体来说还是很高效的 尤其来大量套接字的场景下 但对于Regular File 来说
  • 【Linux学习】epoll详解

    什么是epoll epoll是什么 按照man手册的说法 是为处理大批量句柄而作了改进的poll 当然 这不是2 6内核才有的 它是在2 5 44内核中被引进的 epoll 4 is a new API introduced in Linu
  • linux网络编程实现投票功能

    投票系统 1 说明 写了一个投票系统 过程是先配置好服务器 在写一个网上投票功能 要实现网上投票功能 其实功能实现还是很简单的 麻烦一点的在于过程比较繁杂 要做的东西还是挺多的 2 过程 第一步 配置httpd服务器 先配置好httpd服务
  • 网络层:IP协议

    本博文分享的是网络层的IP协议 从IP协议的基本概念 协议格式开始分析并分享出来 IP协议的基本概念 不同于讨论TCP UDP时只讨论通信主机之间的关系 在讨论IP协议中 会加上主机之间的网络来一起进行讨论分析 主机 一般配有IP地址 路由
  • webbench剖析

    webbench 其为linux上一款web性能压力测试工具 它最多可以模拟3万个并发连接数来测试服务器压力 其原理为fork多个子进程 每个子进程都循环做web访问测试 子进程将访问的结果通过管道告诉父进程 父进程做最终结果统计 其主要原
  • 【Linux网络(C++)】——网络套接字(TCP/UDP编程模型)多进程,多线程,线程池服务器开发(画图解析)

    目录 一 套接字基本概念 IP地址 TCP和UDP协议 端口号 端口号vs 进程pid 网络字节序 本地字节序转换成网络字节序 网络字节序转换为本地字节序 二 套接字的基本操作 socket的创建 域 domain 类型 type 协议 P
  • 高并发的epoll+线程池,业务在线程池内

    epoll是linux下高并发服务器的完美方案 因为是基于事件触发的 所以比select快的不只是一个数量级 单线程epoll 触发量可达到15000 但是加上业务后 因为大多数业务都与数据库打交道 所以就会存在阻塞的情况 这个时候就必须用
  • linux 网络编程---->多路复用:select实例!

    好吧 我承认找了好久 网上都没有像样的完整的实例 然后自己参照书自己写一个吧 gt server 端代码 gt server c include
  • socket阻塞与非阻塞,同步与异步、I/O模型

    socket阻塞与非阻塞 同步与异步 作者 huangguisu 1 概念理解 在进行网络编程时 我们常常见到同步 Sync 异步 Async 阻塞 Block 非阻塞 Unblock 四种调用方式 同步 所谓同步 就是在发出一个功能调用时
  • 基于epoll的聊天室程序

    epoll相对于poll和select这两个多路复用的I O模型更加的高效 epoll的函数很简单 麻烦的地方在于水平出发和边沿触发 用张图来说明下 ET 边沿 只是在状态反转时触发 比如从不可读到可读 而LT 水平 就是如果可读 就会一直
  • linux系统PXE自动装机无人值守

    PXE高效批量网络装机 PXE服务允许客户机通过网络从远程服务器下载引导镜像 并安装文件或整个操作系统 必须满足的前提条件 客户机的网卡支持PXE协议 且主板支持网络引导 网络中有一台DHCP服务器为客户机分配地址 指定引导文件位置 服务器
  • Linux网络和安全:配置、远程访问与防御指南

    文章目录 Linux 网络和安全 引言 网络配置 IP地址配置 配置网络接口 防火墙设置 安全性加强 Linux网络配置及端口管理 网络配置命令 端口管理 防火墙和安全性设置 防火墙管理工具 安全性设置 Linux远程访问技术 SSH和VP
  • Linux网络编程一步一步学 - 目录(汇总)zhuan

    非常好的关于Linux网络编程的文章 我也是无意中在别人的博客里发现的 在网上搜了一下 这类的文章总共还有很多篇 最后我找到了原作者的姓名 周立发 以及作者的博客空间 本人坚决支持原创 在此将其文章进行了汇总 并且空间首页加入了他的博客链接
  • Linux下Socket编程

    什么是Socket Socket接口是TCP IP网络的API Socket接口定义了许多函数或例程 程式员能够用他们来研发TCP IP网络上的应用程式 要学Internet上的TCP IP网络编程 必须理解Socket接口 Socket接
  • linux下异步RPC的阶段性总结-非阻塞SOCKET客户端

    尽可能使用非阻塞socket int flags s flags fcntl fd F GETFL 0 if flags 1 close fd return 1 flags O NONBLOCK s fcntl fd F SETFL fla
  • 组播技术

    1 概述 1 1 产生背景 传统的IP通信有两种方式 一种是在源主机与目的主机之间点对点的通信 即单播 另一种是在源主机与同一网段中所有其它主机之间点对多点的通信 即广播 如果要将信息发送给多个主机而非所有主机 若采用广播方式实现 不仅会将
  • TCP通信流程解析

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用
  • linux非阻塞socket教程

    本文并非解释什么是非阻塞socket 也不是介绍socket API的用法 取而代替的是让你感受实际工作中的代码编写 虽然很简陋 但你可以通过man手册与其它资源非富你的代码 请注意本教程所说的主题 如果细说 内容可以达到一本书内容 你会发
  • poll()函数详解

    poll提供的功能与select类似 不过在处理流设备时 它能够提供额外的信息 include
  • Http协议详解

    引入 超文本传输协议 HTTP HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 1960年美

随机推荐

  • Avue

    Avue中 avue crud的事件调用
  • c语言程序小时工资计算,C语言入门之工资计算

    includeint main 1 请输入税前工资 int money 0 printf 请输入您的税前工资 scanf d money 2 养老保险 个人8 单位12 double yangLao1 money 0 08 double y
  • 微信支付逻辑图

    微信支付时序图 微信支付官方文档https pay weixin qq com wiki doc api index html xml与对象的互转 微信使用xml格式而不使用json通信 也确实有点奇葩 签名 千万不要以为只是MD5一下 要
  • 前端实现图片悬浮_悬浮图片之上效果实现

    其实很简单 就是一个margin top的问题 但是需要relative的定位方式才能悬在上面 html部分 草帽的创新 聚集国内外优秀人才 聚焦新技术及产品研究 以开放互联的理念 驱动企业创新发展 实现怎样的创新 服务全国品牌用户 实现多
  • Anchor-Free目标检测模型

    FCOS Fully Convolutional One Stage Object Detection 已开源 FoveaBox Beyond Anchor based Object Detector 未开源 FCOS 摘要 我们提出了一种
  • Android2023暑期实习---网易游戏一面面经

    Android2023暑期实习 网易游戏一面面经 2022 03 28 14 00 网易游戏一面 个人感觉网易游戏面试 题目有一定难度特别考验基础 自己基础不太行 加之开盘就慌了 肯定后面就是全局崩溃 主要是那些算法和操作系统 还有一些框架
  • Nginx配置-开启Http认证basic authentication

    Nginx配置 开启Http认证basic authentication txt 生成密码 将密放置于配置文件 修改nginx conf 重新加载nginx配置生效 认证测试 生成密码 可以使用htpasswd 或者使用openssl 比如
  • Android APP安装后在桌面上不显示应用图标

    前几天在写项目的时候运行的时候突然Android桌面上没有了应用图标 但是应用里面下载的应用有 调试版本和发布正式的版本都没有 之前以为是因为用了不同的keystore发布了两个不同的正式版本造成的问题 后来在看别人的文章才知道是什么问题
  • Win10中将WSL Ubuntu20.04设置普通用户为默认用户

    直接通过Microsoft Store安装的Ubuntu默认安装于C盘中 会占用一定空间 在导出wsl至本人电脑E盘后 每次登录都是root用户 参考网上教程使用 Ubuntu 20 04 config default user 用户名来更
  • prometheus通过node_exporter抓取的数据准确计算磁盘使用率

    公司使用的openstack的备份服务组件karbor 要查询所使用的备份nas磁盘使用率的需求 根据以前的查询语句 很快写出如下的prom sql 100 topk 1 node filesystem free device 100 no
  • SDRAM详解(结构框图、容量计算、寻址方式、初始化)

    1 SDRM介绍 SDRAM Syncronized Dynamic Ramdam Access Memory 是同步动态随机存储器 是DRAM的升级版 在SDRAM的基础上又发展出DDR double rate 即双倍速度的SDRAM D
  • vue-cli 工程中 访问插槽 数据

    具体解释参考文档 这个插槽啊 怎么说呢 如果你不开发组件 几乎很少用到 甚至用不到 访问插槽呢 使用方法vm slots 插槽名字 如果有的插槽没有名字 则使用vm slots default 访问 打印得到都是数组 得到dom 元素 vm
  • make_moons函数

    生成半环形数据 sklearn datasets make moons n samples 100 shuffle True noise None random state None 参数 n samples 整数型 可选 默认为100 产
  • Java中return、continue和break的区别

    之前一直对return continue break用法有混淆 今日特此学习 1 return 直接跳出当前的方法 返回到该调用的方法的语句处 继续执行 2 break 在循环体内结束整个循环过程 3 continue 结束本次的循环 直接
  • Flame Graphs 火焰图安装与使用

    一 火焰图概述 火焰图 flame graph 是性能分析的利器 通过它可以快速定位性能瓶颈点 perf 命令 performance 的缩写 是 Linux 系统原生提供的性能分析工具 会返回 CPU 正在执行的函数名以及调用栈 stac
  • 380. O(1) 时间插入、删除和获取随机元素

    实现RandomizedSet 类 RandomizedSet 初始化 RandomizedSet 对象 bool insert int val 当元素 val 不存在时 向集合中插入该项 并返回 true 否则 返回 false bool
  • [机缘参悟-74]:沟通技巧-无论在职场还是在家,尽量少用反问句

    目录 反问句的案例 尽量不要使用反问句 避免使用反问词 把反问句改为陈述句 反问句的案例 那天闲聊 邻居老贾向老友们诉苦 老伴今天又用反问句 款待 他了 中午炒菜时 老伴让他拿一瓶油来 老贾问 油瓶在哪里 你觉得油瓶会在哪里 老贾又问 是不
  • 解决k8s集群环境内存不足导致容器被kill问题

    背景 最近线上环境上出现了一个问题 k8s集群环境Pod中的tomcat容器运行一段时间后直接被killd 但有时一切看起来正常 不能准确判断在什么时机出现被Killd问题 本文就此问题介绍了Linux内存不足原因以及为什么特定进程会被杀死
  • nRF24L01单芯片2.4GHz收发模块射频信道频率

    框架图 管脚图 操作模式配置 射频信道频率 RF通道频率决定了 nRF24L01 使用的通道中心 该通道在 1Mbps 时占用 1MHz 带宽 在 2Mbps 时占用 2MHz 带宽 nRF24L01 可以在 2 400GHz 到 2 52
  • poll()函数详解

    poll提供的功能与select类似 不过在处理流设备时 它能够提供额外的信息 include