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

网站建设中的策略医院网站php源码

网站建设中的策略,医院网站php源码,centos支持wordpress,阿里云ace wordpress目录 一、创建字符设备1、申请设备号方法一方法二 2、创建类方法一方法二 3、创建设备 二、创建字符设备驱动1、初始化#xff1a;cdev_init2、添加到内核#xff1a;cdev_add 三、一个完整的字符设备驱动程序1、驱动源码2、测试demo 一、创建字符设备 1、申请设备号 方法一… 目录 一、创建字符设备1、申请设备号方法一方法二 2、创建类方法一方法二 3、创建设备 二、创建字符设备驱动1、初始化cdev_init2、添加到内核cdev_add 三、一个完整的字符设备驱动程序1、驱动源码2、测试demo 一、创建字符设备 1、申请设备号 方法一 alloc_chrdev_region在未指定设备号的情况下使用 dev_t devid; alloc_chrdev_region(devid, 0, 1, test); major MAJOR(devid); /* 获取主设备号 */ minor MINOR(devid); /* 获取次设备号 */方法二 register_chrdev_region在给定设备号的情况下使用 int major; int minor; dev_t devid; devid MKDEV(major, minor); register_chrdev_region(devid, 1, test);通 过 alloc_chrdev_region 或者 register_chrdev_region 申请的设备号释放函数都是unregister_chrdev_region。 2、创建类 方法一 class_register把类注册进内核类需要提前准备好。与class_unregister配对使用。 //用法一先申请内存再初始化 struct class *my_class;my_class kzalloc(sizeof(*my_class), GFP_KERNEL); my_class-name my_class; my_class-owner THIS_MODULE;class_register(my_class); // 会在/sys/class/下创建my_class目录//用法二定义结构体 struct class my_class {.name my_class,.owner THIS_MODULE, };class_register(my_class); // 会在/sys/class/下创建my_class目录方法二 class_create创建类并注册进内核返回类结构体指针。与class_destroy配对使用。 struct class *my_class; my_class class_create(THIS_MODULE, my_class); // 会在/sys/class/下创建my_class目录阅读class_create的源码会发现class_create和class_register最后都调用了__class_register。两者都会在/sys/class/下创建设备类节点是个文件夹。 3、创建设备 device_create创建设备需要传入class和设备号返回device结构体指针。与device_destroy配对使用。 struct device *device; device device_create(class, NULL, devid, NULL, device_name); // 会在/dev/下创建device_name设备节点内核源码中实际上device_create用的并不多反而是device_register与device_add更常见其实它们之间的调用关系是device_create-device_registe-device_add。在较新版本的内核中是device_create-device_create_groups_vargs-device_add。 二、创建字符设备驱动 通过上面的第一部分可以完成一个字符设备的创建并在/dev/下面生成对应的设备节点。但是此时还不能够对设备节点进行write/read/ioctl等操作因为并没有为设备注册相应的驱动。cdev是Linux内核中的一个结构体定义在linux/cdev.h中代表字符设备驱动的实例。cdev结构体中包含了字符设备驱动所需的各种信息如设备号、设备文件操作函数等。通过cdev可以将设备文件操作函数与设备驱动关联起来实现对字符设备的操作。 1、初始化cdev_init struct cdev my_cdev;// 文件操作描述符 static struct file_operations my_fops {.owner THIS_MODULE,.open my_open,.release my_release,.read my_read,.write my_write,.unlocked_ioctl my_ioctl, };cdev_init(my_cdev, my_fops);2、添加到内核cdev_add cdev_add(my_cdev, devid, 1);cdev_init完成对cdev结构体的初始化cdev_add将cdev注册进内核并与设备号关联起来。当应用层对设备节点进行操作时会根据设备节点的设备号去内核中匹配对应的文件操作描述符之后调用其中的回调函数。 卸载驱动时使用cdev_del函数将字符设备驱动从内核中删除。 三、一个完整的字符设备驱动程序 一个字符设备驱动除了包含必要设备号dev_t、所属类class、设备device、驱动cdev这些信息此外还会有其它私有数据。为方便管理将所有信息定义到一个结构体中。 1、驱动源码 #include linux/init.h #include linux/module.h #include linux/fs.h #include linux/cdev.h #include linux/types.h #include linux/kernel.h #include linux/errno.h #include linux/device.h #include linux/uaccess.h#define CLASS_NAME my_class #define DEVICE_NAME my_device #define BUFFER_SIZE 1024 #define MY_IOCTL_RESET _IO(M, 0)struct chardev {char name[32];dev_t devid;struct cdev cdev;struct class *class;struct device *device;int major;int minor; };static char buffer[BUFFER_SIZE]; static struct chardev my_dev;static int my_open(struct inode *inode, struct file *file) {pr_info(%s\n, __func__);return 0; }static int my_release(struct inode *inode, struct file *file) {pr_info(%s\n, __func__);return 0; }static ssize_t my_read(struct file *file, char __user *user_buffer, size_t count, loff_t *offset) {ssize_t bytes_read 0;int remaining_bytes 0;remaining_bytes BUFFER_SIZE - *offset;if (remaining_bytes 0) {return 0;}bytes_read min_t(size_t, count, remaining_bytes);if (copy_to_user(user_buffer, buffer *offset, bytes_read)) {return -EFAULT;}*offset bytes_read;return bytes_read; }static ssize_t my_write(struct file *file, const char __user *user_buffer, size_t count, loff_t *offset) {ssize_t bytes_written 0;int remaining_bytes 0;remaining_bytes BUFFER_SIZE - *offset;if (remaining_bytes 0) {return -ENOSPC;}bytes_written min_t(size_t, count, remaining_bytes);if (copy_from_user(buffer *offset, user_buffer, bytes_written)) {return -EFAULT;}*offset bytes_written;return bytes_written; }static long my_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {switch (cmd) {case MY_IOCTL_RESET:memset(buffer, 0, BUFFER_SIZE);pr_info(buffer reset\n);break;default:return -EINVAL;}return 0; }static struct file_operations my_fops {.owner THIS_MODULE,.open my_open,.release my_release,.read my_read,.write my_write,.unlocked_ioctl my_ioctl, };static int __init chardev_init(void) {int ret;// 1. 分配设备号ret alloc_chrdev_region(my_dev.devid, 0, 1, my_devid);if (ret 0) {pr_err(Failed to allocate device number: %d\n, ret);return ret;}my_dev.major MAJOR(my_dev.devid);my_dev.minor MINOR(my_dev.devid);pr_info(major %d, minor %d\n, my_dev.major, my_dev.minor);// 2. 初始化cdev结构体、添加到内核cdev_init(my_dev.cdev, my_fops);ret cdev_add(my_dev.cdev, my_dev.devid, 1);if (ret 0) {pr_err(Failed to add cdev: %d\n, ret);unregister_chrdev_region(my_dev.devid, 1); // 记得注销设备号return ret;}// 3. 创建类my_dev.class class_create(THIS_MODULE, CLASS_NAME);if (IS_ERR(my_dev.class)) {ret PTR_ERR(my_dev.class);pr_err(Failed to create class: %d\n, ret);return ret;}// 4. 创建设备my_dev.device device_create(my_dev.class, NULL, my_dev.devid, NULL, DEVICE_NAME);if (IS_ERR(my_dev.device)) {ret PTR_ERR(my_dev.device);pr_err(Failed to create device: %d\n, ret);class_destroy(my_dev.class); // 记得注销类return ret;}pr_info(%s done\n, __func__);return 0; }static void __exit chardev_exit(void) {device_destroy(my_dev.class, my_dev.devid);class_destroy(my_dev.class);cdev_del(my_dev.cdev);unregister_chrdev_region(my_dev.devid, 1);pr_info(%s done\n, __func__); }module_init(chardev_init); module_exit(chardev_exit); MODULE_LICENSE(GPL); MODULE_AUTHOR(xxx);2、测试demo #include stdio.h #include stdlib.h #include fcntl.h #include unistd.h #include sys/ioctl.h#define DEVICE_PATH /dev/my_device #define MY_IOCTL_RESET _IO(M, 0) static int fd; static char buffer[256];int file_write(void) {ssize_t ret;// 打开设备文件fd open(DEVICE_PATH, O_RDWR);if (fd 0) {perror(Failed to open device);return -1;}// 写入数据到设备文件ret write(fd, Hello, device!, 14);if (ret 0) {perror(Failed to write to device);close(fd);return -1;}printf(Write data to device: Hello, device!\n);// 关闭设备文件close(fd);return 0; }int file_read(void) {ssize_t ret;// 打开设备文件fd open(DEVICE_PATH, O_RDWR);if (fd 0) {perror(Failed to open device);return -1;}// 读取设备文件中的数据ret read(fd, buffer, sizeof(buffer));if (ret 0) {perror(Failed to read from device);close(fd);return -1;}printf(Read data from device: %s\n, buffer);// 关闭设备文件close(fd);return 0; }int file_ioctl(void) {ssize_t ret;// 打开设备文件fd open(DEVICE_PATH, O_RDWR);if (fd 0) {perror(Failed to open device);return -1;}// 重置设备文件中的数据ret ioctl(fd, MY_IOCTL_RESET);if (ret 0) {perror(Failed to ioctl);close(fd);return -1;}printf(Device buffer reset\n);// 关闭设备文件close(fd);return 0; }int main(void) {file_write();file_read();file_ioctl();return 0; }
http://www.zqtcl.cn/news/841698/

相关文章:

  • 没有官方网站怎么做seo优化营销推广平台都干什么的
  • 网盘搜索网站怎么做中国建设银行网站股份结构变化
  • 有ip怎么用自己的主机做网站惠州网站制作维护
  • 优质的网站制作在线编辑器
  • 盘锦做网站电话网络营销做私活网站
  • 有关网站建设的毕业设计外卖网站的建设与推广
  • cms 做网站用模板网站做h5宣传页多少钱
  • 坪山网站建设行业现状官方建网站有哪些步骤
  • 软件下载网站模版单页网站开发实例下载
  • 张家口网站建设vewanseo实战技术培训
  • 机加工网站室内设计联盟论坛
  • 汕头装修接单网站wordpress php加密
  • 重庆网站建设推广设置wordpress静态主页
  • 科技设计公司网站模板下载网站建设计划 文库
  • 建设美食网站做的好的阅读类的网站有哪些
  • 全屏网站模板制作教程吴江建设局房产网站
  • 浠水网站建设漳州找人做网站要求哪些
  • 做网站需要前台和后台吗公众号制作要求
  • 做一个网站 如何盈利模式招聘网站排行榜2021
  • 免费做网站网站有人哪些c 网站开发网易云课堂百度云下载
  • 高端品牌网站设计欣赏扬中网站建设包括哪些
  • 手机怎么访问微网站网络运营商电话
  • 怎么成立网站战争局势最新消息
  • 嘉定网站设计制作报价crm系统营销
  • 一个网站做几个关键词怎么样子做网站
  • 关于做网站的创新创业策划书怎么进网站后台管理系统
  • 品牌型网站开发wap网站开发工具
  • 网站改版设计微信淘宝购物券网站是怎么做的
  • 网站建设基本流程心得网站设计开发报价
  • 泉州网站建设网站制作电商网站建设需要