当前位置: 首页 > news >正文

31.使用等待队列实现阻塞访问




1.驱动wq.c编写

#include <linux/module.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/errno.h>
#include <linux/atomic.h>
#include <asm/atomic.h>
#include <linux/wait.h>struct device_test{dev_t devn;struct cdev cdev_test;struct class* class;struct device* device;char buf[32];int flag;
};struct device_test dev1;struct wait_queue_head test_wq;static int open_test (struct inode *inode, struct file *file){//如果多个任务打开则会回滚,只允许一个任务打开file->private_data = &dev1;printk("this is open test\n");return 0;
}static ssize_t read_test (struct file *file, char __user *buf, size_t size, loff_t *loff){printk("this is read_kernel\n");struct device_test* dev_test = (struct device_test*)file->private_data;wait_event_interruptible(test_wq,dev_test->flag);if(copy_to_user(buf,dev_test->buf,strlen(dev_test->buf)) !=0){printk("read test is error\n");return -1;}return 0;
}static ssize_t write_test (struct file *file, const char __user *buf, size_t size, loff_t *loff){printk("this is write kernel\n");dev1.flag = 1;wake_up_interruptible(&test_wq);struct device_test* dev_test = (struct device_test*)file->private_data;if(copy_from_user(dev_test->buf,buf,strnlen_user(buf, sizeof(dev_test->buf) - 1)) != 0){printk("write test is error\n");return -1;}printk("kernel buf is %s\n",dev_test->buf);return 0;
}static int release_test (struct inode *, struct file *){printk("this is release test\n");return 0;
}static struct file_operations ops ={.owner = THIS_MODULE,.open = open_test,.read = read_test,.write = write_test,.release = release_test,
};static int param_init(void){int ret;init_waitqueue_head(&test_wq);dev1.flag = 0;if((ret = alloc_chrdev_region(&dev1.devn, 0, 1, "devnum_alloc")) == 0){printk("动态分配成功:主设备号 %d, 次设备号 %d\n", MAJOR(dev1.devn), MINOR(dev1.devn));} else {printk("动态分配失败!\n");goto register_devn_err;}dev1.cdev_test.owner = THIS_MODULE;cdev_init(&dev1.cdev_test,&ops);ret = cdev_add(&dev1.cdev_test,dev1.devn,1);if (ret < 0){goto cdev_add_err;}dev1.class = class_create(THIS_MODULE,"test");if(IS_ERR(dev1.class)){ret = PTR_ERR(dev1.class);goto class_create_err;}//param1 :需要创建的类目录名称dev1.device = device_create(dev1.class,NULL,dev1.devn,NULL,"test");//param1: 类结构体指针 param2:父设备,一般为空 param3: 设备号 param4:设备节点名称if(IS_ERR(dev1.device)){ret = PTR_ERR(dev1.device);}return 0;
device_create_err:class_destroy(dev1.class);class_create_err:cdev_del(&dev1.cdev_test);cdev_add_err:unregister_chrdev_region(dev1.devn,1);register_devn_err:return ret;
}static void param_exit(void){device_destroy(dev1.class,dev1.devn);//param1: 类目录指针 param2:对应的设备号class_destroy(dev1.class);//param1: 类目录cdev_del(&dev1.cdev_test);unregister_chrdev_region(dev1.devn,1);//param 1:释放的设备号 param 2:释放:设备数量printk("bye bye 您勒\n");
}module_init(param_init);
module_exit(param_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("quan");
MODULE_VERSION("v1.0");

2.Makefile编写

obj-m += wq.o
KDIR:=/lib/modules/6.2.0-37-generic/build
PWD?=$(shell pwd)
all:make -C $(KDIR) M=$(PWD)  modulesecho $(PWD)
clean:rm -rf *.ko *.o *.mod *.mod.o *.mod.c *.symvers *.ordertest:aarch64-linux-gnu-gcc test.cinstall:cp *.out *.ko ../../linux-kernel/linux-6.17.5/kmodules

3.read.c write.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>int  main(){int fd;char buf[32] ={0};fd = open("/dev/test",O_RDWR);if(fd < 0){printf("打开失败\n");return -1;}read(fd,buf,sizeof(buf));printf("read buf is %s\n",buf);close(fd);return 0;
}

4.编译及测试

make gcc read.c -o read.out    
gcc write.c -o write.outinsmod wq.ko./write.out 
./read.out
read buf is nihao

http://www.dtcms.com/a/561935.html

相关文章:

  • Tyme 技术赋能:节气与季节的高效求解实战攻略
  • 【C++】2025CSP-J第二轮真题及解析
  • 网站建设教程流程更改wordpress主题语言
  • 朝阳区网站建设蒙特网设计公司
  • 济南网站优化厂家做同城服务网站比较成功的网站
  • 老鼠目标检测数据集(3000张)
  • 想做个网站怎么做长沙五百强企业名单
  • 九江建网站报价wordpress wiki 整合
  • 中英文版网站建设小广告制作
  • 05-深度学习的原理:探讨深度学习的工作原理和数学基础
  • 【深度学习新浪潮】AI缺陷检测:从技术原理到工业落地实践
  • lol英雄介绍网站模板网络广告推广员
  • 接单网站设计 只做设计图报价cpa推广联盟平台
  • kotlin学习 基础知识一览
  • 开通建立企业网站谷歌浏览器下载安卓版
  • 基于 venv 快速搭建 Python 环境
  • C 文件操作全解速览
  • MCP指南
  • 基于双向时序卷积网络(BiTCN)与支持向量机(SVM)混合模型的时间序列预测代码Matlab源码
  • 怎样免费做一个网站免费推广app是什么意思
  • 构建现代Web应用:使用React框架打造单页面应用
  • 仿站是什么企业vi设计欣赏
  • 招聘 负责网站开发购买了域名怎么使用
  • C++信息学奥赛 递推-动态规划 数塔与过河卒模型实战解析 图例+详解+状态转移方程
  • 具身智能实战(一):物体的抓取1(sdk)
  • 公网ip与内网ip
  • 04-深度学习的基本概念:涵盖深度学习中的关键术语和原理
  • 下海做公关的网站类似于凡科的网站
  • WSL子系统(Ubuntu)安装Docker
  • 服装网站建设策划案杭州设计公司logo