WDS1期第12课 字符设备驱动 7 async异步通知用户空间 驱动代码的kill_fasync函数通知用户的signal函数 fcntl

2023-10-29

前面的query interrupt poll都需要用户程序去主动去读或查询。
async异步通知—可以由驱动程序主动去通知用户程序中断的到来。

信号也可以通知TASK_INTERRUPTIBLE的进程,SIGKILL可以杀掉任何进程,就是传说中的信号9,无法阻挡无法被应用覆盖的终极杀器。列出所有信号:kill -l
在这里插入图片描述

1. test进程间发信号

后台运行该用户进程后,通过kill -USR1 PIDkill -10 PID传递参数,
kill -9 PID 杀掉进程。

#include <stdio.h>
#include <signal.h>

void signal_func(int sign)
{
    static int cnt = 0;
    printf("signal: %d, %d times.\n", signal, ++cnt);
}

// kill -USR1 PID == kill -10 PID
// kill -9 PID // 杀掉进程
int main(argc char **argv)
{
    // 信号处理函数, 
    signal(SIGUSR1, signal_func);
    while(1)
    {
        sleep(1000);
    }
    return 0;
}

进程间传递参数要点:

  1. 注册信号处理函数
  2. 谁来发
  3. 发给谁
  4. 怎么收

2. 驱动代码通知用户异步接收信号

我们的目标是有中断产生时(按键按下),驱动程序去通知用户程序。

  1. 用户代码需要注册信号处理函数 signal(SIGIO, signal_func);
  2. 由驱动程序发信号
  3. 发给用户程序,用户程序要告诉驱动 自己的pid fcntl(fd, F_SETOWN, getpid());
  4. 驱动程序调用某个函数来发 kill_fasync (&keys_async_stct, SIGIO, POLL_IN);,keys_async_stct中包含用户进程的id

用户程序中需要做的事情:

1. fcntl(fd, F_SETOWN, getpid()); 		// 告诉内核,用户进程的pid
2. oflag = fcntl(fd, F_GETFL);			// 
3. fcntl(fd, F_SETFL, oflag | FASYNC);	// 改变fasync标记,最终调用.fasync > fasync_helper(初始化/释放fasync_struct)

2.1 驱动增加的代码

增加一个结构体,保存用户传入的pid等等,

static struct fasync_struct *keys_async_stct;

ISR中增加一行向用户发送异步信号的代码,kill_fasync,

// 向用户进程发送信号, 发给谁,在fasync_struct结构中应该指出,
//   在此之前keys_async_stct应该在helper中被初始化
// 用户程序用fcntl(fd, F_SETOWN, pid)告诉驱动程序,
//   用户调用它时系统调用fops.fasync初始化fasync_struct
kill_fasync (&keys_async_stct, SIGIO, POLL_IN);

fops增加初始化一个函数指针,以及对应的函数去初始化fasync_struct这个结构体,

.fasync  = keys_drv_async,

static int keys_drv_async (int fd, struct file *filp, int on)
{
    // 用helper去初始化fasync_struct这个结构体,初始化之后就可以在IRQ中使用kill_fasync
    return fasync_helper (fd, filp, on, &keys_async_stct);
}

2.2 用户代码

#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

int fd;
void signal_func(int sign)
{
    unsigned char key_val;
    read(fd, &key_val, 1);
    printf("signal read key_val: 0x%x.\n", key_val);
}

int main(int argc, char **argv)
{
    int oflag;

    // 1. 应用程序注册信号处理函数
    // 2. 谁发,在驱动程序中IRQ中kill_fasync发
    //      驱动代码的kill_fasync (&keys_async, SIGIO, POLL_IN);通知用户signal函数
    signal(SIGIO, signal_func);
    fd = open("/dev/k_async_node", O_RDWR);
    if(fd < 0)
    {
        printf("can't open '/dev/k_async_node'.\n");
    }
    // 3. 发给谁,应用程序通过这里告诉驱动程序 发给这个pid
    fcntl(fd, F_SETOWN, getpid());
    // 改变oflag之后驱动程序中的fops.fasync才会被调用,
    //      fasync被调用之后才用helper去初始化fasync_struct这个结构体
    //      那个结构体被初始化后,驱动才知道向谁发信号
    oflag = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, oflag | FASYNC);
    while(1)
    {
        sleep(1000);
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WDS1期第12课 字符设备驱动 7 async异步通知用户空间 驱动代码的kill_fasync函数通知用户的signal函数 fcntl 的相关文章

随机推荐

  • k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1beta1.Ingress: failed to l

    原因 kubectl version v1 22 不再支持v1beta1 所以要解决这个问题需要把ingress nginx 换成最新的版本 1 0 0
  • Android10填坑适配指南,实际经验代码,持续补充

    Android10填坑适配指南 包含实际经验代码 绝不照搬翻译文档 1 Region Op相关异常 java lang IllegalArgumentException Invalid Region Op only INTERSECT an
  • HCIP datacom 821、831题库

    全部黄色底纹为错误题 绿色 全部绿色字体为正确题 关于OSPF缺省路由描述错误的是 由于OSPF路由的分级管理 Type5 7缺省路由的优先级高于Type3路由 OSPF的Router LSA中 如果其Link Type为1 则该LSA描述
  • 几行命令完成docker多网站的部署(wordpress和dedecms)

    建设目标 利用docker技术快速搭建wordpress和dedecms 完成多域名的部署工作 操作时间评估 20分钟 主要部署内容 php7 nginx myssql wordpress dedecms 主要操作过程 几个命令行 安装环境
  • IDEA学习JDBC编程连接MySQL

    IDEA连接数据库可以有两种方式 1 通过Database建立连接 连接成功后可以直接操作数据库 需要注意的是MySQL 8 版本的Driver与之前的有所不同 com mysql cj jdbc Driver 还有一点就是时区问题 全球标
  • 爽啊爽啊爽

    致五个月的兄弟连兄弟姐妹 我们来兄弟连干什么 写程序写程序 写程序 上课的时候干什么 写程序写程序 写程序 下课的时候干什么 写程序写程序 写程序 宿舍的时候干什么 写程序写程序 写程序 开心的时候干什么 写程序写程序 写程序 伤心的时候干
  • URP教务系统自动登录

    文章目录 验证码 获取验证码图片 识别验证码内容 图片降噪处理 自动登录 爬取需要的数据 这篇博客是我对 hack 进学校教务系统的一个过程总结 详细代码已经放在GitHub上 需要的自取 URP教务系统自动登录脚本 验证码 打开网站 ht
  • 内存管理408

    文章目录 一 内存管理概念 1 内存管理概念 1 1 内存管理的基本原理与要求 1 2 逻辑地址与物理地址 1 3 进程的内存映像 1 4 内存保护 1 5 内存共享 2 覆盖与交换 2 1 覆盖 2 2 交换 3 连续分配管理方式 3 1
  • 解决vue-router-active无效问题

    设置的样式中 path为 的icon始终被设置了active样式 解决办法 由于router link to的每个路由首部都存在 因此都可以激活默认路由 这也是为什么当path为 的时候始终有active样式 甚至出现了当点击其他tab按键
  • vue+element-ui+vuex实现 面包屑 + Tag多标签切换功能

    参考网址 https www cnblogs com qdhxhz p 12590324 html 建议 亲测可用 把上一篇文章一起看 从左侧菜单栏看起就不会乱了
  • java居然也能实现简单斗地主功能

    出于无聊 就想着斗地主能否通过java程序来写 后面思考了下确实可以实现 目前只实现了发牌的功能 出牌和智能出牌的代码尚未写 有兴趣的朋友可以和我一起试试看 具体代码还比较简单 具体代码如下 package com xinwei oms i
  • 2023华为OD机试真题-单词倒序(JAVA、Python、C++)

    题目描述 输入单行英文句子 里面包含英文字母 空格以及 三种标点符号 请将句子内每个单词进行倒序 并输出倒序后的语句 输入描述 输入字符串S S的长度1 N 100 输出描述 输出逆序后的字符串 补充说明 标点符号左右的空格 0 单词间空格
  • COM学习笔记8_IDispatch (调度接口) 自动化

    一般的通讯方式 客户 lt gt COM vbtl 接口 lt gt COM组件 自动化通讯方式 客户 自动化控制器 lt gt IDispatch Invoke lt gt 调度接口 或vbtl接口 lt gt 实现IDispatch接口
  • springboot整合shiro完整配置

    springboot整合shiro完整配置 springboot整合shiro的maven依赖 springboot版本为2 1 7 shiro版本为1 5 3
  • 实验四 手写数字识别的神经网络算法设计与实现

    一 实验目的 通过学习BP神经网络技术 对手写数字进行识别 基于结构的识别法及模板匹配法来提高识别率 二 实验器材 PC机 matlab软件 三 实验内容 按照BP神经网络设计方法选用两层BP网络 构造训练样本集 并构成训练所需的输入矢量和
  • 求凹多边形的视觉中心,不是质心、重心

    思路都是google上找的 思路1 效果不是很好 勉强可以 reference http stackoverflow com questions 25495560 how can i find the best place to fit a
  • linux使用mail命令发送像模像样的邮件

    代码功能 发出带标题 正文 收件人 抄送收件人和附件的邮件 代码如下 mail content mail content cur time 邮件正文存储文件 attachment attacnment cur time 附件 uuencod
  • redux 时间旅行,你值得拥有!

    啥叫时间旅行 顾名思义 就是可以随时穿越到以前和未来 让应用程序切换到任意时间的状态 我们都知道 一般应用状态都很复杂 创建 维护 修改和弄明白有哪些行为会影响状态都不是一件容易的事儿 redux 的解决方案 整个应用的 state 被储存
  • Jenkins安装配置及插件安装使用

    目录 一 Jenkins安装 Windows下安装 Linux Ubuntu下安装 二 Jenkins配置及插件安装使用简介 插件安装 在线安装 离线安装 账户安全配置 三 Jenkins的环境变量说明 四 Jenkins使用 五 构建 六
  • WDS1期第12课 字符设备驱动 7 async异步通知用户空间 驱动代码的kill_fasync函数通知用户的signal函数 fcntl

    前面的query interrupt poll都需要用户程序去主动去读或查询 async异步通知 可以由驱动程序主动去通知用户程序中断的到来 信号也可以通知TASK INTERRUPTIBLE的进程 SIGKILL可以杀掉任何进程 就是传说