深入浅出 Linux设备驱动异步通知介绍

原创 2011年09月01日 14:45:02

结合阻塞与非阻塞访问、poll函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上"中断"地概念,比较准确的称谓是"信号驱动(SIGIO)的异步I/O"。

我们先来看一个使用信号驱动的例子,它通过signal(SIGIO, input_handler)对STDIN_FILENO启动信号机制,输入可获得时input_handler被调用,其源代码如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define MAX_LEN 100
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);
}
main()
{
 int oflags;
 //启动信号驱动机制
 signal(SIGIO, input_handler);
 fcntl(STDIN_FILENO, F_SETOWN, getpid());
 oflags = fcntl(STDIN_FILENO, F_GETFL);
 fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);
 //最后进入一个死循环,程序什么都不干了,只有信号能激发input_handler的运行
 //如果程序中没有这个死循环,会立即执行完毕
 while (1);
}
为了使设备支持该机制,我们需要在驱动程序中实现fasync()函数,并在write()函数中当数据被写入时,调用kill_fasync()函数激发一个信号,此部分工作留给读者来完成。


相关文章推荐

深入浅出:Linux设备驱动之异步通知和异步I/O

原文出处: 时光漫步LH    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类...
  • yuzeze
  • yuzeze
  • 2016年06月29日 15:07
  • 896

linux 设备驱动异步通知总结

  • 2016年02月18日 15:18
  • 16KB
  • 下载

Linux的异步通知字符设备驱动

Fasync字符驱动: 1、在我们用户程序下所做的工作: ⑴ 注册信号处理函数。 通过signal 或sigaction()实现。 ⑵ 使进程成为该文件的的属主进程。  通过fcntl 的F_SETO...

Linux设备驱动之异步通知

Linux设备驱动之异步通知的原理及简单代码实现
  • ljmiaw
  • ljmiaw
  • 2017年07月16日 21:02
  • 67

linux设备驱动开发学习之旅--异步通知

[cpp] view plaincopy /**   * Author:hasen   * 参考 :《linux设备驱动开发详解》   * 简介:android小菜...

linux字符设备驱动-异步通知

异步通知关键步骤: 1,应用注册信号处理函数,使用signal函数; 2,谁来发:驱动发送通知信号; 3,发给谁:驱动发送通知给特定的应用程序,驱动需要知道应用程序的PID号; 4,怎么发:驱...

linux设备驱动归纳总结(三):7.异步通知fasync

linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...

Linux设备驱动一 (3)异步通知

异步通知,就是让驱动去告诉应用,底层硬件发生了什么事,而不是应用主动地去查询驱动,这对系统的性能有一个很大的提升。    应用层次         1、要用fcntl对此文件进行设置,      ...

Linux 设备驱动学习之 异步通知

From:http://blog.csdn.net/ypoflyer/article/details/6131334   异步通知:   使用poll轮询方式的时候,相当于应用程序在需要的时候...

Linux字符设备驱动之异步通知

在linux中,异步通知是使用信号来实现的,而在linux,大概有30种信号,比如大家熟悉的ctrl+c的SIGINT信号,进程能够忽略或者捕获除过SIGSTOP和SIGKILL的全部信号,当信号背捕...
  • Lyanzh
  • Lyanzh
  • 2017年08月10日 10:09
  • 173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入浅出 Linux设备驱动异步通知介绍
举报原因:
原因补充:

(最多只允许输入30个字)