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

本文介绍了如何在Linux环境下利用异步通知机制使驱动程序能在有数据时主动通知应用程序。主要内容包括开发环境配置、应用程序及驱动程序的具体操作步骤,以及信号处理函数的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、开发环境

1、内核:Linux 2.6.22.6;

2、JZ2440

3、ubuntu 9.10


二、异步通知

使用异步通知,能够实现当驱动程序有数据时,主动发信号告诉应用程序。

1、应用程序需要做的事

(1)编写信号处理函数,即当收到信号时你要执行的函数,并用signal函数注册,如:signal(SIGIO,my_signal_fun)。

(2)驱动是通过PID确认要把信号发给哪个应用程序的。所以,准备接收驱动程序发送来的信号的应用程序需要把自己的PID告诉驱动程序。这个过程是通过下面三句话实现的。

fcntl(fd,F_SETOWN,getpid());//getpid的到本应用程序的pid
oflags= fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC);//执行词句会调用设置的.fasync = xxx,对应的xxx()函数,xxx()会调用fasync_helper()函数设                            //置PID等信息

2、驱动程序需要做的事

(1)声明fasync_struct类型的结构体变量,如static struct fasync_struct *key_async。上面设置的PID等信息就是填充这个结构体变量。

(2)在file_operations添加.fasync =xxx,并编写xxx函数。xxx()主要调用fasync_helper()函数设置PID等信息。

(3)在想发信号的地方使用函数kill_fasync,如kill_fasync (&key_async, SIGIO, POLL_IN)。key_async结构体包含了发送的设置信息。


3、四个要素

(1)应用程序注册信号处理函数 收到信号执行信号处理函数

(2)谁发 驱动程序发信号

(3)发给谁 应用程序告诉驱动程序PID

(4)怎么发 驱动程序调用kill_fasync


三、命令
man getpip 通过这种方式看需要加的头文件,使用方法等。

kill -9 PID 结束进程


四、过程中的问题

发现把printf("my_signal_fun \n");放到read(fd,&keyval,1);上面如函数1,不会打印my_signal_fun。而放到其下面如函数2,则能正常打印。不不知为何。

函数1

void my_signal_fun(int signum)
{
unsigned char keyval;


printf("my_signal_fun \n");
read(fd,&keyval,1);
printf("keyval = 0x %x \n",keyval);
}

函数2

void my_signal_fun(int signum)
{
unsigned char keyval;

read(fd,&keyval,1);

printf("my_signal_fun \n");
printf("keyval = 0x %x \n",keyval);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值