一. 简介
前面文章学习了 应用程序对异步通知的处理方法,另一篇文章实现了Linux驱动对异步通知的处理:
Linux应用程序对异步通知的处理-CSDN博客
Linux异步通知实验:驱动中异步通知的处理-CSDN博客
本文继续Linux异步通知实验,主要实现Linux应用程序对异步通知的处理(也就是信号处理函数)。
二. Linux异步通知实验:应用程序对异步通知的处理
1. 编写应用程序
在 15_async_notice工程目录下创建应用程序文件 signalApp.c,应用程序对异步通知的处理如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>/*
*测试按键是否按下
* 运行命令: ./signalApp /dev/key_irq
*/int fd; //信号处理函数
void sigio_signal_handler(int num)
{int ret = 0;int key_value = 0;ret = read(fd, &key_value, sizeof(key_value));if(ret < 0){printf("read key_value error!\n");}else{printf("Key0 Press! key_value: %d\n", key_value);}
}int main(int argc, char* argv[])
{int ret = 0;char * device_name = NULL;int key_value = 0;int flags = 0;if(argc != 2){printf("main's param number error!\n");return -1;}device_name = argv[1];fd = open(device_name, O_RDWR);if(fd < 0){printf("open led device failed!\n");return -1;}//1. 注册信号处理函数signal(SIGIO, sigio_signal_handler);//2. 将本应用程序PID告诉内核fcntl(fd, F_SETOWN, getpid()); //3. 开启异步通知flags = fcntl(fd, F_GETFL); //获取文件状态fcntl(fd, F_SETFL, flags | FASYNC);//开启当前进程的异步通知功能while(1){sleep(2);}return 0;
}
2. 编译应用程序
对 应用程序 signalApp.c进行编译:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/15_async_notice$ arm-linux-gnueabihf-gcc signalApp.c -o signalApp
我这里可以编译通过,生成应用程序 signalApp。
三. 对驱动模块进行测试
1. 拷贝驱动模块与应用程序
将上一篇文章(Linux驱动对异步通知处理的代码)编译生成的驱动模块 key_irq.ko与上面的应用程序 signalApp拷贝到 开发板系统中:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/15_async_notice$ sudo cp signalApp key_irq.ko /home/wangtian/linux/nfs_File/rootfs/lib/modules/4.1.15/ -f