include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define MAX_LEN 100
//信号SIGIO的处理函数
void input_handler(int num)
{char data[MAX_LEN];int len;/* 读取并输出STDIN_FILENO上的输入 */len = read(STDIN_FILENO, &data, MAX_LEN);data[len] = 0;printf("input available: %s\n", data);
}void main()
{int oflags;/* 启动信号驱动机制 */signal(SIGIO, input_handler);//设置本进程为STDIN_FILENO文件的拥有者,没有这一步内核不会知道应该将信号发送给哪个进程fcntl(STDIN_FILENO, F_SETOWN, getpid());//获得文件的状态标志oflags = fcntl(STDIN_FILENO, F_GETFL);//启动异步通知机制fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);while(1);
}

由此可见,为了在用户空间中能处理一个设备释放的信号,它必须完成3项工作

(1)通过F_SETOWN IO控制命令设置设备文件的拥有者为本进程,这样从设备驱动发出的信号才能被本进程接收到。

(2)通过F_SETFL IO控制命令设置设备文件支持FASYNC,即异步通知机制。

(3)通过signal()函数连接信号和信号处理函数。

注:【fcntl系统调用】  
   
功能描述:根据文件描述词来操作文件的特性。
 
用法:  
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
 
 
参数:  
fd:文件描述词。
cmd:操作命令。
arg:供命令使用的参数。
lock:同上。

有以下操作命令可供使用

F_GETFL :读取文件状态标志。

F_SETFL :设置文件状态标志。

F_GETOWN:获取当前在文件描述词 fd上接收到SIGIO 或 SIGURG事件信号的进程或进程组标识 。
F_SETOWN:设置将要在文件描述词fd上接收SIGIO 或 SIGURG事件信号的进程或进程组标识

转载于:https://www.cnblogs.com/snake-hand/archive/2013/06/16/3138681.html

使用信号实现异步通知机制的例子相关推荐

  1. fasync驱动异步通知机制

    fasync简介 编辑 异步通知fasync应用于系统调用signal和sigaction函数,简单的说,signal函数就是让一个信号与与一个函数对应,每当接收到这个信号就会调用相应的函数.[1] ...

  2. Linux内核中断引入用户空间(异步通知机制)【转】

    转自:http://blog.csdn.net/kingdragonfly120/article/details/10858647 版权声明:本文为博主原创文章,未经博主允许不得转载. 当Linux内 ...

  3. 你真的懂Linux内核中的阻塞和异步通知机制吗?(花了五天整理,墙裂推荐!)

    工科生一枚,热衷于底层技术开发,有强烈的好奇心,感兴趣内容包括单片机,嵌入式Linux,Uboot等,欢迎学习交流! 爱好跑步,打篮球,睡觉. 欢迎加我QQ1500836631(备注CSDN),一起学 ...

  4. [架构之路-38]:目标系统 - 系统软件 - Linux OS硬件设备驱动必须熟悉的六大工作机制之(并发与互斥、阻塞与非阻塞、异步通知)

    目录 前言: 第4章 内核程序并发与互斥机制 4.1 内核程序优先级机制 4.2 内核线程状态:并发与竞争 4.3 内核锁的类型 4.4 乱序问题 第5章 阻塞与非阻塞机制 5.1 什么是阻塞问题 5 ...

  5. Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》

    阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通知则意味着设备通知应用程序自身可访问.(异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种 ...

  6. 字符设备驱动程序之异步通知

    如果要实现:平时应用程序处于休眠状态,当按下按键时,驱动告诉应用程序由状态改变,需要读取按键状态了.那么就需要建立驱动和应用程序之间的通信. 应用函数中的某个函数怎么使用,需要包含哪些头文件,可以在服 ...

  7. Linux驱动技术(四) _异步通知技术

    异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资源可用时,驱动会主动通知指定的应用程序,和应用层的"信号"相对应, ...

  8. Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O

    阻塞和非阻塞访问.poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了. 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态 ...

  9. Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)...

    信号  ( signal ) 机制是 UNIX 系统中最为古老的进程间通信机制,很多条件可以产生一个信号. 信号的产生: 1,当用户按下某些按键时,产生信号. 2,硬件异常产生信号:除数为 0 ,无效 ...

最新文章

  1. 滴滴大整改:9月8日至15日暂停深夜叫车服务
  2. java 数组集合转换_Java 实例 – 集合转数组
  3. 学习的本质在于触发了你的思考
  4. 安卓StepView事件进度条的简单实现
  5. jQuery-事件委托(基本概述+实例)
  6. 中国滤清器制造行业竞争格局分析与发展战略规划研究报告2022年版
  7. 【若依(ruoyi)】Swagger 上传接口
  8. 《编写高质量代码改善JavaScript程序的188个建议》读书笔记
  9. 跟着官方文档能学懂React Hooks就怪了
  10. canvas 判断哪个元素被点击_监听 Canvas 内部元素点击事件的三种方法
  11. META-INF目录是干啥用的?
  12. python3中maketrans()方法的使用
  13. 计算机准考证打印是什么时候,2019年9月计算机等级什么时候打印准考证?
  14. static用法报错解决:cannot declare member function to have static linkage [-fpermissive]
  15. mysql的架构及查询sql的执行流程(一)
  16. Java金额大写转换
  17. uni-app实现本地打包安卓APK
  18. Codeforces Round #738 (Div. 2) 2021.08.16
  19. uni-app如何获取位置信息(经纬度)
  20. python df删除特定行_pandas.DataFrame删除/选取含有特定数值的行或列实例

热门文章

  1. Android调用Java WebSevice篇之二
  2. SaCa DataViz 企业版 | 高性能大数据分析引擎
  3. [HNOI2012]集合选数 BZOJ2734
  4. 企业任务管理工具“日事清”获星河互联1000万A轮融资
  5. xml dtd 约束建立xml文档
  6. java实现邮件定时发送
  7. jQueryPager(JQuery分页插件pagination实现Ajax分页)
  8. 问题 J: Sequence Problem (II) : Array Practice
  9. int是python的内置函数吗_Python内置int函数详细介绍
  10. Git修改用户名和邮箱的方法(附Git常用命令)