当前位置: 首页 > news >正文

读取按键的四种方式

  1. 查询方式:非阻塞
    • 在app调用open的时候,使用O_RDWR|O_NONBLOCK
  2. 阻塞方式
    • 在app调用open的时候,使用O_RDWR,不传入O_NONBLOCK,
    • 当驱动程序有数据时,read函数就会返回数据
    • 负责APP将在内核态休眠,直至有数据时被内核态唤醒
  3. poll 方式

    pfd.fd = fd;        // 之前打开的文件描述符pfd.events = POLLIN; // 关注可读时间pfd.revents = 0;while (1){ret = poll(&pfd,nfds,5000); //5秒超市if(ret > 0){if(pfd.events == POLLIN){while((read(fd,&event,sizeof(event)) == sizeof(event))){printf("Event: type=%d code=%d value=%d\n", event.type, event.code, event.value);}}}else if( ret == 0){printf("time out \n");}}
  1. 异步通知(select)
    void my_signal_cb(int num)
    {struct input_event event;while((read(fd,&event,sizeof(event))== sizeof(event))){printf("Event: type=%d code=%d value=%d\n", event.type, event.code, event.value);}
    }/*注册信号处理函数*/
    signal(SIGIO, my_signal_cb);fd = open(argv[1], O_RDWR | O_NONBLOCK); // 以非阻塞式读取
    if (fd < 0)
    {printf("open %s err\n", argv[1]);return -1;
    }/*把APP的进程号告诉给驱动程序*/
    //作用:设置文件描述符 fd 的拥有者(owner)为当前进程。
    //F_SETOWN:命令参数,表示设置文件描述符的拥有者(进程ID或进程组ID)。
    fcntl(fd, F_SETOWN, getpid()); /*使能异步通知*/
    //获取文件描述fd的当前标志位(file status flags)
    //F_GETFL:命令参数,表示获取文件状态标志。
    flags = fcntl(fd, F_GETFL);//flags | FASYNC:在原有的标志位基础上按位或(OR)添加 FASYNC 标志。
    fcntl(fd, F_SETFL, flags | FASYNC);while(1)
    {//干自己想要干的事情就可以了,直到驱动程序有信号来通知他
    }
    
http://www.dtcms.com/a/272783.html

相关文章:

  • IMU误差模型
  • 显卡GPU的架构和工作原理
  • 输入框过滤选项列表,el-checkbox-group单选
  • JDK 1.7 vs JDK 1.8
  • 为什么域名加端口访问需要放行端口?
  • 【算法训练营Day11】二叉树part1
  • c语言初阶 指针
  • CH9121T电路及配置详解
  • 【算法笔记 day three】滑动窗口(其他类型)
  • Spring Security 技术原理与实战全景详解
  • 【OD机试题解法笔记】根据IP查找城市
  • 观众信息设置与统计(视频高级分析与统计功能)
  • 身份认证缺陷
  • Gulp实现功能及插件总结
  • java并发包下CountDownLatch、Semaphore用法
  • 【牛客刷题】活动安排
  • i.mx8 网络速率测试
  • Transformer:自注意力驱动的神经网络革命引擎
  • 网络综合实验
  • Linux中gdb使用
  • Spring- @Autowired和@Resource 的区别
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_keepalive_probes
  • linux系统---部署应用
  • day049-初识Ansible与常用模块
  • 如何远程访问在WSL运行的Jupyter Notebook
  • 如何安装python以及jupyter notebook
  • 创客匠人洞察:AI 时代创始人 IP 打造如何突破效率与价值的平衡
  • RabbitMQ 高级特性之消息分发
  • 【Fargo】发送一个rtp包的过程1:怎么统一加twcc序号
  • 华锐云空间展销编辑器:开启数字化展示新时代​