Linux的异步通知接收中要注意使能顺序
异步通知是一种通知,相当于用于应用程序的中断。可用于驱动通知进程,也可以进程通知进程。
异步通知接收步骤
默认信号的接收
默认的异步IO信号是SIGIO,使用这个信号的接收程序如下:
...
static void signal_handler(int sig)
{
...
}
...
int fd,oflags;fd = open(xxx, xxx);if(fd != -1){
signal(SIGIO,signal_handler); //
fcntl(fd,F_SETOWN,getpid()); //
oflags = fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC);
...
}
...
signal_handler 是通知要运行的函数;
signal(SIGIO,signal_handler); 是注册信号对应的函数
fcntl(fd,F_SETOWN,getpid()); 这句是设置异步通知要通知给谁
oflags = fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC); 这两句是使能异步通知。
重点就是使能这部要放在最后。原因如下:如果使能放在前面,异步通知发生在使能之后,注册信号函数之前的话。由于找不到注册函数,系统会执行默认处理函数。就是会将进程终止。这样就发生故障,与预期不符。
实时信号的接收
实时信号就是更换默认信号SIGIO为实时信号。默认信号SIGIO有些缺点,不支持排队,在信号处理函数进行过程中如果来了多次SIGIO信号的话会被忽略的。实时信号有很多,SIGRTMIN~SIGRTMAX的都是实时信号。
实时信号程序如下:
...
static void test_handler(int sig, siginfo_t *info, void *context)
...
struct sigaction test;
int flag;
fd = open(xxx,xxx);
test.sa_sigaction = test_handler;
test.sa_flags = SA_SIGINFO;
sigemptyset(&test.sa_mask);
sigaction(SIGRTMIN, &test, NULL);
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETSIG, SIGRTMIN);
oflags = fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC);
test_handler是通知要运行的函数;
sigaction(SIGRTMIN, &test, NULL); 是注册信号对应的函数
fcntl(fd,F_SETOWN,getpid()); 这句是设置异步通知要通知给谁
fcntl(fd, F_SETSIG, SIGRTMIN); 是设置异步通知使用的信号是什么
oflags = fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC); 这两句是使能异步通知。
重点如上,使能放在最后。
异步通知发送
异步通知发送分为两种,进程向进程发送和驱动向进程发送。
进程向进程发送
这个比较简单,使用kill函数就可以。
#include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);
kill的函数pid是正数的时候是目标的进程,负数分几种情况可以查阅相关资料。
驱动向进程发送
驱动向进程发送主要分两步
1 编写驱动得fasync函数,这个函数里要包括fasync_helper,注册异步通知
2 在需要发送异步通知的位置,先判断异步通知申请成功并可以获得进程号,然后使用kill_fasync发送通知
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的