异步通知
Posted 梦提三尺剑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步通知相关的知识,希望对你有一定的参考价值。
先写一个测试函数:
#include <stdio.h>
#include <signal.h> //signal函数的需要
设置信号处理函数!!!用signal1.
void my_signal_fun(int signum)
{
static int cnt = 0;
printf("signal = %d, %d times\n", signum, ++cnt)
}
作用:打印信号。
int main(int argc, char **argv)
{
signal(SIGUSR1, my_signal_fun);
信号和中断差不多,需要注册
while(1)
{
sleep(1000);
}
}
可以用kil命令来发送信号,需要明确进程号,即PID数值。
kill -USR1 833 USR1 = 10
kill -10 833
kil -9 833 默认退出
要点:
1.注册信号处理函数
2.发送信号,kill -10 833
目标:
按下按键时,驱动程序通知应用程序
1.应用程序要注册信号处理函数
2.确定谁发信号(驱动)
3.发给谁(应用),应用程序告诉内核自己的PID!
4.怎么发?驱动调用某个函数发送。kill_fasyn
实施:在中断程序中发送数据
先定义一个结构体:
static struct fasync_struct *button_async;
在中断程序wake_up下面再加上:
kill_fasync(&button_async, SIGIO, POLL_IN);
建立新的fileoperation结构体L:
static struct file_operations fifth_drv_fops = {
.owner = THIS_MODULE,
.open = fifth_drv_open;
.read = fifth_drv_read,
.release = fifth_drv_release,
.poll = fifth_drv_poll,
.fasync = fifth_drv_fasync
};
新建相应的处理函数:
static int fifth_drv_fasync(int fd, struct file *filp, int on)
{
return fasync_helper(fd, filp, on, &button_async);
}
通过F_SETTOWN命令,调用fcntl(fd,F_SETDOWN,pid)应用程序调用这个函数来告诉驱动自己的PID。
应用程序读出flag,并修改之。
Oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, oflags | FASYNC);
fasync_helper函数用于初始化结构体,
新的main函数:
void my_signal_fun(int signum)
{
unsigned char key_val;
read(fd,&key_val,1);
printf("key_val:0x%x\n",key_val);
}
int main(int argc, char **argc)
{
unsigned char key_val;
int ret;
signal(SIGIO,my_signal_fun); //信号处理函数
fd = open("/dev/buttons",O_RDWR);
if(fd < 0)
{
printf("can‘t open!\n");
}
fcntl(fd, F_SETOWN, getpid())
Oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, Oflags | FASYNC);
while(1)
{
sleep(1000);
}
}
以上是关于异步通知的主要内容,如果未能解决你的问题,请参考以下文章