首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

#include

int kill(pid_t pid, int sig);

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

驱动向进程发送

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

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230202A01WEN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券