linux poll操作

POLLHUP vs POLLNVAL vs EPOLLHUP POLLNVAL POLLNVALis equivalent to EBADF: it means the file descriptor does not actually refer to any open file, i.e. it was closed or never open to begin with. This can never happen except as a result of a programming error or intentional attempt to query 阅读详情
2009-03-31 19:31

poll和sellect实现功能差不多,但poll效率高,以后要多用poll

poll()接受一个指向结构'struct pollfd'列表的指针,其中包括了你想测试的文件描述符和事件。事件由一个在结构中事件域的比特掩码确定。当前的结构在调用后将被填写并在事件发生后返回。在SVR4(可能更早的一些版本)中的 "poll.h"文件中包含了用于确定事件的一些宏定义。事件的等待时间精确到毫秒 (但令人困惑的是等待时间的类型却是int),当等待时间为0时,poll()函数立即返回,-1则使poll()一直挂起直到一个指定事件发生。下面是pollfd的结构。

      struct pollfd {
          int fd;         /* 文件描述符 */
          short events;   /* 等待的事件 */
          short revents; /* 实际发生了的事件 */
      };
      
于select()十分相似,当返回正值时,代表满足响应事件的文件描述符的个数,如果返回0则代表在规定事件内没有事件发生。如发现返回为负则应该立即查看 errno,因为这代表有错误发生。

如果没有事件发生,revents会被清空,所以你不必多此一举。

这里是一个例子

    /* 检测两个文件描述符,分别为一般数据和高优先数据。如果事件发生
       则用相关描述符和优先度调用函数handler(),无时间限制等待,直到
       错误发生或描述符挂起。*/
   
    #include <stdlib.h>
    #include <stdio.h>
  
    #include <sys/types.h>
    #include <stropts.h>
    #include <poll.h>
  
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
  
    #define NORMAL_DATA 1
    #define HIPRI_DATA 2
  
    int poll_two_normal(int fd1,int fd2)
    {
        struct pollfd poll_list[2];
        int retval;
  
        poll_list[0].fd = fd1;
        poll_list[1].fd = fd2;
        poll_list[0].events = POLLIN|POLLPRI;
        poll_list[1].events = POLLIN|POLLPRI;
  
        while(1)
        {
            retval = poll(poll_list,(unsigned long)2,-1);
            /* retval 总是大于0或为-1,因为我们在阻塞中工作 */
  
            if(retval < 0)
            {
                fprintf(stderr,"poll错误: %s\n",strerror(errno));
                return -1;
            }
    
            if(((poll_list[0].revents&POLLHUP) == POLLHUP) ||
               ((poll_list[0].revents&POLLERR) == POLLERR) ||
               ((poll_list[0].revents&POLLNVAL) == POLLNVAL) ||
               ((poll_list[1].revents&POLLHUP) == POLLHUP) ||
               ((poll_list[1].revents&POLLERR) == POLLERR) ||
               ((poll_list[1].revents&POLLNVAL) == POLLNVAL))
              return 0;
  
            if((poll_list[0].revents&POLLIN) == POLLIN)
              handle(poll_list[0].fd,NORMAL_DATA);
            if((poll_list[0].revents&POLLPRI) == POLLPRI)
              handle(poll_list[0].fd,HIPRI_DATA);
            if((poll_list[1].revents&POLLIN) == POLLIN)
              handle(poll_list[1].fd,NORMAL_DATA);
            if((poll_list[1].revents&POLLPRI) == POLLPRI)
              handle(poll_list[1].fd,HIPRI_DATA);
        }
    }
     


Linux高级字符设备:Poll操作 在用户程序中,select()和poll()也是与设备阻塞与非阻塞访问息息相关的,使用非阻塞I/O的应用程序通常会使用select和poll系统调用查询是否可对设备进行无阻塞的访问。(1)对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应等待队列添加到poll_table中;2)如果当前不可读写,则阻塞进程,并等待驱动程序唤醒,重新调用poll函数,或超时返回。2、核心层调用sys_select() ------> do_select()(1)将要监控的文件添加到文件描述符集; 阅读详情

相关推荐

linux 字符驱动框架(用户态的read,write,poll是怎么操作驱动的)

这篇文章是通过对一个简单字符设备驱动的操作来解释,用户态的读写操作是怎么映射到具体设备的。 chardev.c /* 参考:深入浅出linux设备驱动开发 */ #include &amp;lt;linux/module.h&amp;gt; #include &amp;lt;linux/init.h&amp;gt; #include &amp;lt;linux/fs.h&amp;gt; #include &amp;lt;linux/uacc

Lester的博客 1393

IO多路复用的三种实现:poll

包含poll和select的区别以及poll和select的缺点,附加利用poll单进程实现可多客户端连接的服务器代码

比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)曾说过:如果你没看过这些博客,那么你的编程不会拥有智慧,你的代码不可能附有灵魂。 876

Keil5 安装与卸载全攻略:从零开始到完美避坑

本文提供了Keil5集成开发环境的完整安装与卸载指南。针对嵌入式开发新手,详细解析了安装前的关键准备、MDK核心与C51双环境的安装激活步骤、常见问题排查,并重点介绍了如何彻底卸载软件以避免残留问题,帮助用户从零开始搭建稳定高效的开发环境。

weixin_29172963的博客 636

Linux并发处理方式——多路复用之poll

Linux并发处理方式——多路复用之poll 前言: poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。 一、相关函数介绍 #include <poll.h> struct pollfd { int f

weixin_45062087的博客 486

PHP证书图片生成

$realname = "姓名"; $schoolname = "学校"; $idcard = "身份证号"; $image = imagecreatefrompng('certification.png'); // 证书模版图片文件的路径 $red = imagecolorallocate($image,00,00,00); // 字体颜色

4036

sdio wifi 移植

介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3

Enosji的博客 9612

linux 事件队列实现,linux – poll(2)不会清空事件队列

显然,如果要轮询传入数据,则应使用可用数据(调用read()),否则它仍将存在,并且poll将立即返回. POLLOUT实际上不需要对称操作,但通常需要尽快调用下一个write().所以作为经验法则POLLIN – >读,POLLOUT – >写.您还应该在再次调用poll之前重置pollfd结构.fds[0].fd = sck;fds[0].events = POLLIN;fds[0...

weixin_32137855的博客 380

HighTec安装(官网免费)编译 嘎嘎详细~

安装软件最好有自己的一套安装规则,工程软件除了安装主体外还会有很多其他的东西,比如license或者还会有一些驱动,如果所有都随意安装会导致你需要卸载,或者更新软件时,有的需要将原来软件卸载干净,如果没有清晰的安装路径那真是灾难啊~请确保此目录中只有个人许可证。这样基本的配置就ok了,下面打开hightec软件检验下license是否识别到了,会让你选个工作区,建议自己建一个,要不你以后就找不到了,,,如下图拉到下面,按照要求填写信息,随便写就行,注意主要的MAC地址要填本机的物理地址,然后点击2即可。

weixin_60793044的博客 1万+

Linux高级字符设备之Poll操作

在用户程序中,select()和poll()也是与设备阻塞与非阻塞访问息息相关的,使用非阻塞I/O的应用程序通常会使用select和poll系统调用查询是否可对设备进行无阻塞的访问。select系统调用最终会引发设备驱动中的poll函数被执行。一、select()系统调用:用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程。1.select()原型:intselect...

banbenggang9818的博客 207

从软体机器人到鞋垫分析:Abaqus超弹性材料(Ogden模型)仿真配置全流程

本文详细介绍了Abaqus中Ogden模型在超弹性材料仿真中的应用全流程,涵盖从实验数据导入、参数拟合到模型构建与求解优化的关键步骤。特别针对鞋垫分析等生物力学场景,提供了单元选择、接触设置和并行计算等实用技巧,帮助工程师实现高精度仿真分析。

weixin_42525385的博客 400

AUTOSAR RTE配置实战:从ECU分区到Task映射的完整指南

本文提供了一份AUTOSAR RTE配置的完整实战指南。从创建ECU分区、定义OS任务,到实现Runnable Entity与Task的精确映射,详细解析了每一步的操作要点与常见陷阱。文章结合配置工具界面,旨在帮助开发者高效完成RTE配置,确保系统实时性与数据一致性,是掌握AUTOSAR核心开发流程的实用参考。

weixin_29228203的博客 486

linux 非阻塞之poll和select操作

poll和select操作 一个应用使用设备时采用 阻塞IO:会使进程休眠,让出CPU,高效 非阻塞IO:不停查询,占用CPU,低效 一个应用控制多个设备文件来达到需求,但当一个设备文件发生阻塞时调用进程被休眠, 其他设备文件就停止工作 阻塞方式:在read调用时阻塞 应用–>read()–>sys_read—>xxx_read例程 IO复用:阻塞一组文件的描述符 应用–>...

weixin_42399752的博客 451

需要Perfetto分析的anr

anr类的问题,经常会有系统cpu,内存负载不高,iowait也不高,主线程状正常的,这类问题通过常规的日志无法分析,需要抓取Perfetto来分析应用的情况。event log中也没有异常。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 63

Linux设备驱动程序——高级字符驱动程序操作(poll机制)

poll机制

holly的专栏 773

微信小程序 - 详细实现随机生成订单号,微信小程序创建订单号思路,不重复订单号生成的方法,小程序自动生成固定规则的订单号流水号(必须是唯一不重复的订单号,生成唯一订单号)详细生成方法,示例代码教程最新

微信小程序,vue2,vue3,订单号,流水号思路,微信小程序 详细实现随机生成订单号(JavaScript),随机生成商户订单号,根据当前时间随机生成流水号或者订单号,微信小程序之商家订单,订单号随机生成器,自动生成固定规则的订单号(前缀+采购日期+6位流水号)微信小程序 生成外卖顺序号,生成订单号或流水号简单方法,实现订单号生成唯一的解决方案,如何按日期生成订单号,14位编号=8位日期(+6位流水号),自动生成订单号(固定+日期+数字),销售订单号自动生成。在微信小程序开发中,详解实现随机生成创建订单号

🏆 前端领域优质创作者 1188

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

linux poll操作read write操作使用

/* poll 阻塞的使用: poll就是对描述符进行监听,和select类似,但是poll没有最大描述符的限制,并且poll的描述符使用之后不会被清空,而select每次使用之后都要重新设置.不过他俩作用是一样的, 进行阻塞操作. 通过调用poll之后,内核可以告诉我们是否可以读写操作. pollfd结构体定义如下: struct pollfd {

宁静致远的博客 3228

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Linux驱动】轮询操作select()和poll()

使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询可对设备进行无阻塞的访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被执行。 select()和poll()系统调用的本质是一样的。本系列只关注设备驱动中的函数层,对于应用层具体请参考《APUE》或《TLPI》(linux/unix系统编程手册),楼主手上就有这两本书,在编写应用态测试

wenqian 'blog 4381

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

linux驱动之poll操作

POLL操作 1、POLL运行过程: poll是一个系统调用,其内核入口函数为sys_poll,sys_poll差点儿不做不论什么处理直接调用do_sys_poll,do_sys_poll的运行过程能够分为三个部分:  1,将用户传入的pollfd数组复制到内核空间,由于拷贝操作和数组长度相关。时间上这是一个O(n)操作,这一步的代码在do_sys_poll中包含从函数開始到...

weixin_34378045的博客 318

【转】Linux高级字符设备之Poll操作

原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275559.html 在用户程序中,select()和poll()也是与设备阻塞与非阻塞访问息息相关的,使用非阻塞I/O的应用程序通常会使用select和poll系统调用查询是否可对设备进行无阻塞的访问。select系统调用最终会引发设备驱动中的poll函数被执行。 一、select...

weixin_30527323的博客 96

oracle 轮询Linux 文件,linux设备驱动之Poll轮询操作(五)

#include#include#include#include#include#include#include#include#include#include#include#include#include "memdev.h"static mem_major = MEMDEV_MAJOR;bool have_data = false; /*表明设备有足够数据可供读*/module_param(...

weixin_39602637的博客 124
上一篇: linux epoll模型
下一篇: 文件描述符及其作用
yaotinging
博客等级 码龄18年 7粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值