一、用ioctl传递字符数组

#ifndef __LED_H__
#define __LED_H__
//编写命令码
#define UACCESS_BUF _IOW('a',1,char [128])
#endif#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "led.h"
#define CNAME "myled"int major;
//打开
int mycdev_open(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
//关闭
int mycdev_close(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
long my_ioctl(struct file* file,unsigned int cmd,unsigned long arg)
{int ret;char kbuf[128] = {0};if(cmd == UACCESS_BUF){ret = copy_from_user(kbuf,(void*)arg,sizeof(kbuf));printk("kbuf = %s\n",kbuf);    }return 0;
}
const struct file_operations fops ={.open = mycdev_open,.release = mycdev_close,.unlocked_ioctl = my_ioctl,
};
//入口
static int __init demo_init(void)
{//注册字符设备驱动major = register_chrdev(0,CNAME,&fops);if(major <0){printk("registe chrdec is error\n");return major;}printk("major=%d\n",major);return 0;
}
static void __exit demo_exit(void)
{//注销字符设备驱动unregister_chrdev(major,CNAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include "led.h"
char buf[128]={"I am world"};
int main(int argc,char const *argv[])
{int fd = -1;fd = open("/dev/myled",O_RDWR);if(-1 == fd){perror("open is error\n");exit(1);}ioctl(fd,UACCESS_BUF,buf);close(fd);return 0;
}

测试现象:用dmesg命令查看到,在内核中打印的语句是与用户空间传输的“I am world”一致

二、用ioctl传递结构体

#ifndef __LED_H__
#define __LED_H__typedef struct{int width;int higth;
}image_t;
//编写命令码
#define UACCESS_STRUCT _IOW('a',1,image_t)
#endif#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "led.h"
#define CNAME "myled"int major;
//打开
int mycdev_open(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
//关闭
int mycdev_close(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
long my_ioctl(struct file* file,unsigned int cmd,unsigned long arg)
{int ret;image_t kimage;if(cmd == UACCESS_STRUCT){ret = copy_from_user(&kimage,(void*)arg,sizeof(kimage));printk("width = %d\n",kimage.width);    printk("higth = %d\n",kimage.higth);kimage.width += 10;kimage.higth += 10;ret = copy_to_user((void*)arg,&kimage,sizeof(kimage));if(ret){printk("to user error\n");return -EIO;}}return 0;
}
const struct file_operations fops ={.open = mycdev_open,.release = mycdev_close,.unlocked_ioctl = my_ioctl,
};
//入口
static int __init demo_init(void)
{//注册字符设备驱动major = register_chrdev(0,CNAME,&fops);if(major <0){printk("registe chrdec is error\n");return major;}printk("major=%d\n",major);return 0;
}
static void __exit demo_exit(void)
{//注销字符设备驱动unregister_chrdev(major,CNAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include "led.h"
int main(int argc,char const *argv[])
{image_t image ={20,1024};int fd = -1;fd = open("/dev/myled",O_RDWR);if(-1 == fd){perror("open is error\n");exit(1);}ioctl(fd,UACCESS_STRUCT,&image);printf("width=%d\n",image.width);printf("higth=%d\n",image.higth);close(fd);return 0;
}

测试现象:dmesg查看到width=20,higth=1024;用户空间接收到内核传回的+10的值,width=30,higth=1034

华清远见上海中心班--11.17作业相关推荐

  1. 华清远见上海中心培训感言

    最早接触华清是在2022年寒假后学校安排的线上实习,这时也正值春招时间,投递了许多简历经历了部分面试,在求职面试中发现了自己求职优势的不足.一方面,在大学没有积累足够的专业知识以及动手实验操作能力和参 ...

  2. 华清远见上海中心22071班--11.19作业

    题目:实现开发板点灯操作 程序要求: 1)分部实现注册字符设备驱动 2)自动创建设备节点 3)通过结构体对led灯地址进行映射 4)次设备号完成私有数据传参 5)在open函数中获取到次设备号,用私有 ...

  3. 华清远见上海中心22071班--11.24作业

    题目:应用层采取ioctl命令控制,驱动代码用GPIO子系统,实现开发板6盏灯的循环亮灭 头文件程序: #ifndef __LED_H__ #define __LED_H__typedef enum{ ...

  4. 华清远见上海中心22071班--11.28作业

    题目:三个按键实现按键中断,key1>>led1,key2>>led2, key3>>led3.按键按一下灯亮,再按一下灯灭 . #include <linu ...

  5. 华清远见上海中心22071班--11.29作业

    题目:paltform总线中通过名字.名字列表和设备树三种方式实现driver和device匹配 方式一>>>名字: #include <linux/init.h> #i ...

  6. 华清远见上海中心22071班 9.19作业

    目录 1.并发服务器 1)多进程并发服务器 2)多线程并发服务器 2.域套接字 1.流式域套接字(TCP) 1.1服务器 1.2客户端 2.报式套接字(UDP) 2.1服务器 2.2客户端 1.并发服 ...

  7. 华清远见上海中心22071班 8.25作业

    目录 1.用无头结点的循环链表实现约瑟夫环问题 头文件: 功能函数: 主函数: 终端输出: 2.顺序栈实现进制转换问题 头文件: 功能函数: 主函数: 终端输出: 1.用无头结点的循环链表实现约瑟夫环 ...

  8. 华清远见上海中心22071班 9.2作业

    1.用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分.要求用文件IO实现. 函数: #include <stdio.h> #include <fcntl.h&g ...

  9. 华清远见上海中心22071班

    按键中断实现电灯 1.将myirq写入设备树文件中 myirq{interrupt-parent = <&gpiof>;interrupts = <7 0>,<8 ...

最新文章

  1. OpenVINO实时人脸表面3D点云提取
  2. ifndef/define/endif——主要目的是防止头文件的重复包含和编译
  3. AX宏Macros运算
  4. pycharm导入python环境是空的_PyCharm导入python项目并配置虚拟环境的教程详解
  5. Matlab--三维散点插值成曲面
  6. 一个测试新人的职业规划——三个月
  7. 计算机网络课设-小型校园网,计算机网络课设 小型校园网
  8. Nacos系列:欢迎来到Nacos的世界!
  9. 翻牌游戏如何打乱牌面java_如何游戏4Bet底池?
  10. pip和requests模块的安装
  11. 关于Selenium2Library库导入PyCharm无法自动感知关键字的解决方法
  12. 通达OA2017工作流数据报表查询全部流程
  13. Qt定时器QTimer使用教程与代码演示
  14. 晶振的匹配电容计算公式
  15. 精通linux开关机表情包,关机表情包 - 关机微信表情包 - 关机QQ表情包 - 发表情 fabiaoqing.com...
  16. 手把手教你基于Springboot+Vue搭建个人博客网站
  17. 数据库:概念结构设计
  18. Js 高德地图SDK
  19. MATLAB—离散一元、二元、多元函数求导求梯度(二维、三维、多维空间)(diff和gradient)
  20. 史上最好用的SEO工具之一ahrefs

热门文章

  1. 几行JS代码实现b站直播间弹幕抽奖
  2. 220817-3Dslicer配准学习记录
  3. AOSP : Android源码下载
  4. android重写item,android-在RecyclerView.Adap中重写notifyItemChanged的动画
  5. python 中任务 6.3 构建并评分分类模型(SVM模型) 学习笔记3
  6. 2021 缺货 缺货
  7. If-then结构控制介绍
  8. 为什么谐振时电抗为0_调频串并联谐振交流耐压试验装置组成及参数
  9. 铁道部12306后台技术框架 完整异常栈信息以及技术缺点和漏洞
  10. vulnhub-BBS(cute)1.0.1