博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux的异步通知和异步IO(信号)
阅读量:2443 次
发布时间:2019-05-10

本文共 1165 字,大约阅读时间需要 3 分钟。

    在设备驱动中使用异步通知可以使得对设备的访问在进行时,由驱动程序主动通知应用程序进行访问,这样,使用无阻塞IO的应用程序无需轮需设备是否可访问。而阻塞访问也可被类似“中断”的异步通知所取代。

    linux中的异步通知是通过信号来实现的。

    在用户程序中,为了捕获信号,可以使用signal()

void (*signal (int signum,void(*handler))(int))(int)

第一个参数指定信号的值,第二个参数指定前面信号值的处理函数。这个函数是在应用层使用

在设备驱动中异步通知编程比较简单,主要用到一项数据结构和两个函数。数据结构时fasync_struct结构体,

处理FASYNC标志变更的函数

int fasync_helper(int fd,struct file *filp ,int mode,struct fasync_struct **fa)

释放信号用的函数

void kill_fasync(struct fasync_struct **fa,int sig,int band);
static int xxx_fasync(int fd,struct file *filp,int mode){    struct xxx_dev *dev =filp->private_data;    return fasync_helper(fd,filp,mode,&dev->async_queue) }

在设备被正确写入之后,它变得可读,这个时候驱动应释放SIGIO信号以便应用程序捕获

static ssize_t xxx_write(.....){   //写入成功后。释放信号   if(dev->async_queue)      kill_fasync(&dev->async_queue,SIGIO,POLL_IN)}

应用程序可以这样写

void input_handler(int signum){  printf("recive from %d\n",signum); }int main(){  int fd ,oflags;  fd=open("/dev/global",O_RDWR,S_IRUSR | S_IWUSR); if(fd != -1){  //启动信号机制  signal(SIGIO,input_handler);  fcntl(fd,F_SETOWN,getpid());  oflags = fcntl(fd,F_GETFL);  fcntl(fd,F_SETFL,oflags | FASYNC);  while(1)  {    sleep(1000);  }}}

运行程序后,每当写入数据后,都会触发input_handler()这个函数

 

 

 

转载地址:http://wwvqb.baihongyu.com/

你可能感兴趣的文章
做无用之事读无用之书_如何从现有的基础上创建一个无用的基础框
查看>>
ionic4创建应用命令_使用AngularJS和Ionic创建您的第一个移动应用
查看>>
emmet :_使用Emmet快速编写HTML Crazy Fast:交互式指南
查看>>
flux react_使用React.js和Flux创建一个简单的购物车
查看>>
idea 创建todo_创建具有节点和角度的单页Todo应用
查看>>
angularjs路由_具有AngularJS路由和模板的单页应用
查看>>
轻松的节点身份验证:将所有帐户链接在一起
查看>>
js复选框和单选按钮_以角形式处理复选框和单选按钮
查看>>
node.js react_使用Node和React.js构建实时Twitter流
查看>>
ppt 代码语法突出显示_为您的网站代码获取漂亮的语法突出显示
查看>>
ngrepeat数组_使用NgRepeat和NgForm构建动态角度形式
查看>>
使用Laravel 5和AngularJS构建时间跟踪器–第1部分
查看>>
学习JavaScript原生函数以及如何使用它们
查看>>
使用Laravel 5和AngularJS构建时间跟踪器–第2部分
查看>>
应用节点和容器的关系_使用Dockunit对节点应用程序进行容器化测试
查看>>
css内容没有全屏如何全屏_使用大量创意演示构建全屏CSS3菜单
查看>>
angular单页应用_创建一个Laravel和Angular单页注释应用程序
查看>>
使用Node Webkit,Socket.io和MEAN建立实时聊天室
查看>>
ios浏览器滚动交互太差_使用ScrollMagic.js构建交互式滚动网站
查看>>
命令行subl_使用Subl.exe从命令行打开Sublime文本(Windows)
查看>>