linux应用层异步信号处理,linux中驱动异步通知应用程序的方法

#include #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);

/*

将SIGIO信号同input_handler函数关联起来,

一旦产生SIGIO信号,就会执行input_handler,

*/

fcntl(STDIN_FILENO, F_SETOWN, getpid());

/*

STDIN_FILENO是打开的设备文件描述符,

F_SETOWN用来决定操作是干什么的,

getpid()是个系统调用,功能是返回当前进程的进程号

整个函数的功能是STDIN_FILENO设置这个设备文件的拥有者为当前进程。

*/

oflags = fcntl(STDIN_FILENO, F_GETFL);

/*得到打开文件描述符的状态*/

fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);

/*

设置文件描述符的状态为oflags | FASYNC属性,

一旦文件描述符被设置成具有FASYNC属性的状态,

也就是将设备文件切换到异步操作模式。

这时系统就会自动调用驱动程序的fasync方法。

*/

//最后进入一个死循环,程序什么都不干了,只有信号能激发input_handler的运行

//如果程序中没有这个死循环,会立即执行完毕

while (1);

}

再看驱动层代码,驱动层其他部分代码不变,就是增加了一个fasync方法的实现以及一些改动

static struct fasync_struct *fasync_queue;

/*首先是定义一个结构体,其实这个结构体存放的是一个列表,这个列表保存的是

一系列设备文件,SIGIO信号就发送到这些设备上*/

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;

}

在驱动的release方法中我们再调用my_fasync方法

int my_release(struct inode *inode, struct file *filp)

{

/*..processing..*/

drm_fasync(-1, filp, 0);

/*..processing..*/

}

这样后我们在需要的地方(比如中断)调用下面的代码,就会向fasync_queue队列里的设备发送SIGIO信号

,应用程序收到信号,执行处理程序

if (fasync_queue)

kill_fasync(&fasync_queue, SIGIO, POLL_IN);

好了,这下大家知道该怎么用异步通知机制了吧?

以下是几点说明[1]:

1 两个函数的原型

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

一个"帮忙者", 来实现 fasync 设备方法. mode 参数是传递给方法的相同的值, 而 fa 指针指向一个设

备特定的 fasync_struct *

void kill_fasync(struct fasync_struct *fa, int sig, int band);

如果这个驱动支持异步通知, 这个函数可用来发送一个信号到登记在 fa 中的进程.

2.

fasync_helper 用来向等待异步信号的设备链表中添加或者删除设备文件,   kill_fasync

被用来通知拥有相关设备的进程. 它的参数是被传递的信号(常常是 SIGIO)和 band, 这几乎都是 POLL_IN[25](但

是这可用来发送"紧急"或者带外数据, 在网络代码里).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值