驱动程序异步通知应用程序,数据是否可读

linux内核学习---fasync简介 fasync简介 异步通知fasync应用于系统调用signal和sigaction函数,简单的说,signal函数就是让一个信号与与一个函数对应,每当接收到这个信号就会调用相应的函数。[1] 那么什么是异步通知?异步通知类似于中断的机制,当设备可写时,设备驱动函数发送一个信号给内核,告知内核有数据可读,在条件不满足之前,并不会造成阻塞。而不像之前学的阻塞型IO和poll,它们是调用函数进去检 阅读详情

       当我们驱动程序当中有数据可读的时候,可以通过驱动程序中的异步通知机制来通知应用程序数据是否可读,从而提高读取数据的效率。

主要实现思路是:设备I/O驱动如果准备好数据(用户可读或者可写),向用户进程发送信号,用户进程收到信号后调用相关的信号处理函数对设备的数据进行访问。

实现上述的思路需要两方面的实现:用户程序的实现、设备驱动程序的实现。

 

用户程序的实现需要:

(1) 设置执行用户程序的PID作为设备文件的所有者。可通过下面语句实现:

fcntl(STDIN_FILENO, F_SETOWN, getpid());

STDIN_FILENO这里是标准输入的文件描述符,我们可以重定向为设备的文件描述符。

F_SETOWN命令表示设置接收SIGIO或SIGURG信号的进程ID或者进程组ID。

(2) 用户程序必须对访问的设备文件设置FASYNC标志。可通过下面语句实现:

fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | FASYNC);

F_SETFL命令表示设置文件状态标志位(取第3个参数的值)


测试程序一:

/*
 * asynctest.c: use async notification to read stdin
 *
 * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
 * Copyright (C) 2001 O'Reilly & Associates
 *
 * The source code in this file can be freely used, adapted,
 * and redistributed in source or binary form, so long as an
 * acknowledgment appears in derived source files.  The citation
 * should list that the code comes from the book "Linux Device
 * Drivers" by Alessandro Rubini and Jonathan Corbet, published
 * by O'Reilly & Associates.   No warranty is attached;
 * we cannot take responsibility for errors or fitness for use.
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
 
int gotdata=0; //全局flag,判断signal处理函数有没有执行;
void sighandler(int signo) //signal处理函数
{
    if (signo==SIGIO)
        gotdata++;
    return;
}
 
char buffer[4096]; //全局buffer
 
int main(int argc, char **argv)
{
    int count;
    struct sigaction action;
 
//初始化 action
    memset(&action, 0, sizeof(action));
    action.sa_handler = sighandler;
    action.sa_flags = 0;
 
    sigaction(SIGIO, &action, NULL);//绑定action到SIGIO signal
 
    fcntl(STDIN_FILENO, F_SETOWN, getpid());//设置STDIN_FILENOD的owner为当前进程
    fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | FASYNC);//设置STDIN_FILENO的文件状态标志(增加了FASYNC标志)。
    while(1) {
        /* this only returns if a signal arrives */
        sleep(86400); /* one day */
              //当SIGIO signal来了,会将当前进程从sleep唤醒
        if (!gotdata)
            continue;
        count=read(0, buffer, 4096);//从标准输入读数据
        /* buggy: if avail data is more than 4kbytes... */
        write(1,buffer,count);//向标准输出写数据
        gotdata=0;
    }
}

测试程序二:

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

#define MAX_LEN 100
int fd;
//异步通知处理函数,有点类似于软中断
void input_handler(int num)
{
	char data[MAX_LEN];
	int len;
	int temp;
	len = read(fd,&temp,4);
	data[len]=0;
	printf("------------->input available: %d\n",temp);
	memset(data,0,MAX_LEN);
}

int main()
{
	int oflags;
	int buf,ret;
	int i =3;
	
	fd = open("/dev/test", O_RDWR);
	if( fd < 0){
		printf("open error ret = %d, buf = %d\n",ret,buf);
		return -1;
	}

	
	//启动信号驱动机制
 /*
  将SIGIO信号同input_handler函数关联起来,
  一旦产生SIGIO信号,就会执行input_handler,
 */
	signal(SIGIO,input_handler);

/*
    F_SETOWN用来决定操作是干什么的, 
    getpid()是个系统调用,功能是返回当前进程的进程号
    整个函数的功能是STDIN_FILENO设置这个设备文件的拥有者为当前进程。
    属主进程的进程ID号被保存到filp->f_owner中
  */
	fcntl(fd,F_SETOWN,getpid());

  /*得到打开文件描述符的状态*/	
	oflags = fcntl(fd, F_GETFL);

  /*
   设置文件描述符的状态为oflags | FASYNC属性, 一旦文件描述符被设置成具有FASYNC属性的状态,
   也就是将设备文件切换到异步操作模式。 这时系统就会自动调用驱动程序的fasync方法。
  */	
	fcntl(fd, F_SETFL, oflags | FASYNC);

	for(i=0;i<10;i++)
	{
		sleep(1);
		printf("wait for interrupt...\n");
	}
	return 0;
}

驱动程序的当中:

/*首先是定义一个结构体,其实这个结构体存放的是一个列表,这个列表保存的是
  一系列设备文件,SIGIO信号就发送到这些设备上*/
static struct fasync_struct fasync_queue;

定义异步的方法:

static int my_fasync(int fd, struct file * filp, int on) 
/*fasync方法的实现*/
{
	int retval;
	retval=fasync_helper(fd,filp,on,&fasync_queue);
    /*将该设备登记到fasync_queue队列中去*/
	if(retval<0)
		return retval;
	return 0;
}

在中断处理函数中定义:

//这样后我们在需要的地方(比如中断)调用下面的代码,就会向fasync_queue队列里的设备发送SIGIO信号
//,应用程序收到信号,执行处理程序,当是设备可写入的时候采用异步通知应用程序最后的标记应该使用POLL_OUT
	if (&fasync_queue)
		kill_fasync(&fasync_queue, SIGIO, POLL_IN);

实验结果:

bash-4.0# ./test
open major=252, minor=0
wait for interrupt...
wait for interrupt...
wait for interrupt...
EINT1 EINT1 EINT1
------------->input available: 1
wait for interrupt...
wait for interrupt...
wait for interrupt...






Linux驱动开发 异步通知实现详解 信号(signal)使用 POSIX 信号机制,设备可以向进程发送信号,通知某个事件发生。常用的信号包括SIGIO(用于异步 I/O 通知)、SIGUSR1SIGUSR2等。信号适用于简单的通知模型,例如设备可用、读写完成等。poll和select通过poll和select系统调用,用户进程可以监视文件描述符的状态变化,如可读、可写等。设备可以通过改变文件状态来通知用户进程 I/O 操作已经完成。适合需要监视多个文件描述符的情况,如网络服务器的实现。异步 I/O(AIO)使用。 阅读详情

相关推荐

linux异步通知实验

中断是处理器提供的一种异步机制,配置好中断后就可以让处理器去处理其他的事情,当中断发生以后会执行中断服务函数,在中断服务函数中做具体的处理。Linux 应用程序可以通过阻塞或者非阻塞两种方式来访问驱动设备,通过阻塞方式访问,应用程序会处于休眠态,等待驱动设备可以使用。非阻塞方式会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动去查询设备的使用情况。

m0_69211839的博客 1119

驱动程序通知应用程序读取数据的方法总结

mark一下,以后需要。 驱动程序如何通知应用程序读取数据?这是一个很多人都关心的问题。 在此之前,我一直是采用的应用程序主动查询的方式,即,应用程序定时发送IRP来读取驱动程 序的数据。为此,必须考虑一个问题——如果应用程序没有运行,而驱动程序的缓冲区满了,如何处理?此外,应用程序需要不停地发送IRP,但是,每次发送后要Sleep一下,否则,CPU占有率会过高的。

木易云清 3249

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

linux字符驱动之异步通知按键驱动

在上一节里,我们在中断的基础上添加poll机制来实现有数据的时候就去读,没数据的时候,自己规定一个时间,如果还没有数据,就表示超时时间。在此以前,我们都是让应用程序主动去读,那有没有一种情况,当驱动程序有数据时,主动去告诉应用程序,告诉它,有数据了,你赶紧来读吧。答案当然是有的,这种情况在linux里的专业术语就叫异步通知。 上一节文章链接:http://blog.youkuaiyun.com/lwj103

lwj103862095的专栏 6367

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 265

RACECAR底层平台安装:Jetson Nano+ROS Melodic全栈部署指南

移动机器人开发中,底层平台安装是将硬件转化为可编程移动平台的关键起点。其核心在于嵌入式系统、ROS中间件与传感器驱动的深度协同——需兼顾内核模块加载、GPIO/PWM精确控制、I2C设备初始化及ROS工作空间构建等多层技术耦合。尤其在竞速级小车如RACECAR场景下,Jetson Nano的硬件加速能力、MPU6050 IMU固件加载、TB6612FNG电机驱动配置等细节,直接决定运动控制精度与实时性。本文聚焦Ubuntu 18.04 + ROS Melodic + JetPack 4.4.1技术栈,覆盖从

weixin_32025789的博客 255

两种不使用过滤驱动从驱动获取数据的方法

一直想写点技术文章的,但是每次想起这事的时候没时间,有时间的时候又提不起兴致J。 我们有时候需要从系统中某些驱动处理数据的方式,例如作一些过滤、对数据进行一些修改或者监视通过某个设备栈的数据等等。通常情况下是采用Filter Driver的方式实现。但是这样有种种局限性:容易暴露自己的存在、有些情况下可能不能再Detach掉,升级驱动的时候必须重启机器等等。 这里介绍两种通过HOOK方...

iteye_3807的博客 185

Win11系统下Abaqus2022与VS2022+oneAPI2023环境配置全攻略(附VUMAT子程序避坑指南)

本文详细指导在Windows 11系统下,为Abaqus 2022配置Visual Studio 2022与Intel oneAPI 2023的Fortran编译环境,以支持VUMAT等用户子程序开发。内容涵盖软件安装顺序、环境变量关联、快捷方式修改及关键验证步骤,并提供了首个VUMAT子程序的实战编写与模型验证方法,帮助用户高效搭建稳定可靠的仿真开发平台。

pytorch8learner的博客 316

Linux中驱动程序通过fasync异步通知应用程序的实现

摘要:Linux异步I/O通知机制核心函数 fasync_helper和kill_fasync是Linux内核处理异步I/O通知的核心函数: fasync_helper负责注册/取消异步通知: 根据on参数决定启用/禁用通知 使用专用slab缓存分配内存 通过加锁保护全局链表操作 处理3种情况:更新现有条目、移除条目或添加新条目 返回操作结果(1=成功,0=无操作) kill_fasync负责发送信号: 验证条目魔术字 特殊处理SIGURG信号 通过send_sigio发送信号给注册进程 关键数据结构: f

weixin_51019352的博客 1537

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1152

31、车载通信中的可见光通信(VLC)技术解析

本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。

hill8的博客 318

【Linux驱动层】驱动程序同步和异步通知方式

所谓同步,就是“你慢我等你”。所谓异步通知,就是 APP 可以忙自己的事,当驱动程序用数据时它会主动给APP 发信号,这会导致 APP 执行信号处理函数。

zsyyugong的博客 1769

milvus | 第 1 章:从“相似图片搜索”理解 Milvus 向量数据库

本文介绍了向量数据库Milvus的核心概念和基本架构。主要内容包括:1)向量数据库解决的是高维向量相似度检索问题,通过Embedding将非结构化数据转换为向量进行比较;2)Milvus作为分布式向量数据库,包含Proxy、Coordinator、QueryNode等多个组件协同工作;3)关键概念如Collection、Schema、Segment等构成了Milvus的数据组织方式;4)典型使用流程包括创建集合、插入数据、构建索引、加载数据和执行搜索五个步骤。文章为后续深入理解Milvus源码提供了基础知识

weixin_43674738的博客 133

Linux之异步通知机制

是处理器提供的一种,配置好中断后就可以让处理器去处理其他的事情,当中断发生以后会执行中断服务函数,在中断服务函数中做具体的处理。Linux 应用程序可以通过阻塞或者非阻塞两种方式来访问驱动设备,通过阻塞方式访问,应用程序会处于休眠态,等待驱动设备可以使用。非阻塞方式会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动去查询设备的使用情况。如果能提供一种中断机制,

风间琉璃的博客 1876

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 444

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

十一、(正点原子)Linux异步通知

异步通知就是用户空间想对驱动空间读或者写某个数据时,不需要一直去查看此数据是否可读或可写,可以去执行其他的任务,当要读或写的数据可以被读或写的时候,驱动空间会向用户空间发送一个信号。当空户空间接收到这个信号时,就停止现在的任务去执行读或写数据。

Tofu_Cabbage的博客 2289

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux异步IO通知

Linux 应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以使用,非阻塞方式的话会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动的去查询设备的使用情况。“信号”却可以使内核主动通知应用程序,信号类似于我们硬件上使用的“中断”,只不过信号是软件层次上的。

123 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

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

驱动程序基石:异步通知

驱动程序基石:异步通知

赶紧十八丶 882

I/O管理:异步通知

I/O管理:异步通知

CATTLE_L的博客 1067

异步通知《来自Linux驱动程序开发实例》

您所在的位置:读书频道 > 操作系统 > Linux > 1.2.8 异步通知 1.2.8 异步通知 2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) 字号:T |T 综合评级: 想读(9)  在读(2)  已读(1)  品书斋鉴(1)  已有12人发表书评 《Linux驱动程序开发实例》第1章 Linux设备驱动程序模型,本章主要

wangpengqi的专栏 939

异步通知

异步通知: 使用异步通知机制可以提高查询设备的效率。通过使用异步通知,应用程序可以在数据可用时收到一个信号,而无需不停地轮询。 设置异步通知的步骤(针对应用层来说的): 1.首先制定一个进程作为文件的属主。通过使用fcntl系统调用执行F_SETOWN命令时,属主进程的ID号就会保存在filp->f_owner中,目的是为了让内核知道应该通知哪个进程。 2.在设备中设置FASYNC标志。通

wangpengqi的专栏 1114

Linux异步通知

1、Linux 应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备2、上述方式都需要应用程序主动的去查询设备的使用情况,因此诞生了信号(类似硬件使用的中断),当驱动程序可以访问的时候主动就会告诉应用程序。3、阻塞、非阻塞、异步通知,这三种是针对不同的场合提出来的不同的解决方法,没有优劣之分,在实际的工作和学习中,根据实际需求合理选择处理方式。异步通知的核心就是信号,在 arch/xtensa/include/uapi/asm/signal.h 文件中定义了 Linux 所支持的所有信号,这些信号如下所示

chengcao123的博客 1119

异步通知机制

写信号处理函数in val;注册信号处理函数// 3注册信号处理函数打开文件把APP的pid告诉驱动程序;读取驱动程序flag并设置FASYNC位为1。

d0203的博客 1159

Linux驱动开发——(八)Linux异步通知

讲述了Linux内核中的异步通知及其驱动代码。

wJen的博客 1868

【Linux】异步通知与异步I/O

异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点类似硬件的中断,实际上信号是软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。

weixin_47596351的博客 1378
上一篇: S3C2440上MMC/SD卡驱动实例开发讲解(二)
下一篇: sqlite3的简单使用
ADC0809608
博客等级 码龄17年 44粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值