前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux的异步通知接收中要注意使能顺序

Linux的异步通知接收中要注意使能顺序

作者头像
用户9736681
发布2023-02-20 16:38:28
1K0
发布2023-02-20 16:38:28
举报
文章被收录于专栏:嵌入式随笔嵌入式随笔

异步通知是一种通知,相当于用于应用程序的中断。可用于驱动通知进程,也可以进程通知进程。

异步通知接收步骤

默认信号的接收

默认的异步IO信号是SIGIO,使用这个信号的接收程序如下:

代码语言:javascript
复制
...
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的都是实时信号。

实时信号程序如下:

代码语言:javascript
复制
...
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函数就可以。

代码语言:javascript
复制
#include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);

kill的函数pid是正数的时候是目标的进程,负数分几种情况可以查阅相关资料。

驱动向进程发送

驱动向进程发送主要分两步

1 编写驱动得fasync函数,这个函数里要包括fasync_helper,注册异步通知

2 在需要发送异步通知的位置,先判断异步通知申请成功并可以获得进程号,然后使用kill_fasync发送通知

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异步通知接收步骤
    • 默认信号的接收
      • 实时信号的接收
      • 异步通知发送
        • 进程向进程发送
          • 驱动向进程发送
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档