fasync ,异步通知,在驱动和应用程序编写时候的使用 ps signal

本文详细介绍了如何在Linux下通过fcntl、fasync和signal函数实现应用程序对设备的异步信号处理,包括设置文件属主、获取文件标志、启用FASYNC、定义fasync结构、注册回调函数、初始化异步通知以及在释放时移除信号监听。重点在于理解信号处理与设备驱动的交互过程。

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

应用程序        

  很固定的三步

        fcntl(fd, F_SETOWN, getpid());//指定一个文件为属主,与驱动程序联系起来

        Oflags = fcntl(fd, F_GETFL); //取得open时代文件标志符        

        fcntl(fd, F_SETFL, Oflags | FASYNC); //每当FASYNC标志状态改变时,linux设备驱动程序中的fasync()函数将得以执行。

当然还有一步
signal(SIGIO, my_signal_fun);//底层驱动发上来SIGIO的信号,然后调用my_signal_fun

驱动程序



1.定义一个fasync_struct 类型的变量
2.在fops中增加要使用的函数.fasync = xxx_fasync
3.实现这个函数
4.调用fasync_helper进行初始化
return fasync_helper (fd, filp, on, &button_async);
(往往就作为第三步的返回值)
5.在需要发信号的地方使用

kill_fasync (&button_async, SIGIO, POLL_IN);
/*将button_async,发一个SIGIO信号,告诉设备可读*/

6.在release中
从异步通知列表中删除该flip
fasync(-1,filp,0)



ps:

表头文件 #include

功 能: 设置某一信号的对应动作

函数原型 :void (*signal(int signum,void(* handler)(int)))(int);

或者:typedef void(*sig_t) ( int );

sig_t signal(int signum,sig_t handler);

明白了吧,signum,是信号类型

handler是处理函数

意思是当收到某一个特定类型信号时候执行某一个处理函数~~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值