异步通知

异步通知:可试应用程序无需一直轮寻数据是否准备好,而只是在数据到达时收到SIGIO通知。

异步通知机制

应用程序方面:

执行的两个步骤:

1 指定进程作为文件的属主:让内核知道数据到达时通知哪个进程: fcntl(fileno,F_SETOWN,getid());

2设置FASYNC标志,启用异步通知机制。oflags=fcntl(fileno, F_GETFL) fcntl( fileno, F_SETFL, flags|FASYNC)

完成这两步后新书据到达时就发送SIGIO信号到应用程序,应用程序通过signal设置SIGIO的处理函数来处理接受的数据


驱动程序方面

执行三个步骤:

1 当F_SETOWN被调用时,对filp->owner赋值

2 在应用程序执行第二步时,内核调用驱动程序的fasync方法(FASYNC变化时就会调用该方法)

3 数据到达时发送SIGIO给注册的异步通知进程

实现一个数据结构和两个函数

数据结构 struct fasync_struct内核已经提供

struct fasync_struct {
    int    magic;
    int    fa_fd;
    struct    fasync_struct    *fa_next; /* singly linked list */
    struct    file         *fa_file;
};

函数1:fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa); 实现步骤二 从相关进程列表中删除或增加文件

函数2:kill_fasync( struct fasync_struct ** fa, int sig, int band); 实现步骤三

band 对于用来通知可读的异步通知:band几乎总是为poll_in

对于用来通知可写的异步通知:band几乎总是为poll_out



最后注意在文件关闭之前,必须调用fasync方法,以便从活动的异步读取进程列表中删除文件。

scull_p_fasync(-1,filp,0);







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值