第一种是使用mknod手工创建:# mknod

第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。

具体udev相关知识这里不详细阐述,可以移步Linux 文件系统与设备文件系统 —— udev 设备文件系统,这里主要讲使用方法。

在驱动用加入对udev 的支持主要做的就是:在驱动初始化的代码里调用class_create(...)为该设备创建一个class,再为每个设备调用device_create(...)创建对应的设备。

内核中定义的struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用 device_create(…)函数来在/dev目录下创建相应的设备节点。

这样,加载模块的时候,用户空间中的udev会自动响应 device_create()函数,去/sysfs下寻找对应的类从而创建设备节点。

下面是两个函数的解析:

支持字符设备文件自动生成

linux/device.h

struct class *class_create(struct module *owner, const char *name);/*功能:在/sys/class目录下创建一个目录,目录名是name指定的

参数:

struct module *owner - THIS_MODULE

const char *name - 设备名

返回值:

成功:class指针

失败: - bool IS_ERR(const void *ptr)  判断是否出错

long PTR_ERR(const void *ptr)  转换错误码*/

void class_destroy(struct class *cls);/*功能:删除class指针指向的目录

参数:

struct class *cls - class指针*/

struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);/*功能:

在class指针指向的目录下再创建一个目录,目录名由const char *fmt, ...指出、并导出设备信息(dev_t)

参数:

struct class *cls - class指针

struct device *parent - 父对象,NULL

dev_t devt - 设备号

void *drvdata - 驱动私有数据

const char *fmt, ... - fmt是目录名字符串格式,...就是不定参数

返回值:

成功 - device指针

失败 - bool IS_ERR(const void *ptr)  判断是否出错

long PTR_ERR(const void *ptr)   转换错误码*/

void device_destroy(struct class *cls, dev_t devt);/*功能:删除device_create创建的目录

参数:

struct class *cls - class指针

dev_t devt - 设备号*/

创建次序

struct class *class_create(struct module *owner, const char *name);

struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);

删除次序

void device_destroy(struct class *cls, dev_t devt);

void class_destroy(struct class *cls);

实例:

#include #include#include#include#include#include#include#include#includeMODULE_LICENSE("GPL");static struct class *cls =NULL;static int major = 0;static int minor = 0;const int count = 6;#define DEVNAME "demo"

static struct cdev *demop =NULL;//打开设备

static int demo_open(struct inode *inode, struct file *filp)

{//get command and pid

printk(KERN_INFO "%s : %s : %d\n",__FILE__, __func__, __LINE__);return 0;

}//关闭设备

static int demo_release(struct inode *inode, struct file *filp)

{//get major and minor from inode

printk(KERN_INFO "%s : %s : %d\n", __FILE__, __func__, __LINE__);return 0;

}static struct file_operations fops ={

.owner=THIS_MODULE,

.open=demo_open,

.release=demo_release,

};static int __init demo_init(void)

{

dev_t devnum;intret, i;struct device *devp =NULL;//1. alloc cdev obj

demop =cdev_alloc();if(NULL ==demop){return -ENOMEM;

}//2. init cdev obj

cdev_init(demop, &fops);

ret= alloc_chrdev_region(&devnum, minor, count, DEVNAME);if(ret){gotoERR_STEP;

}

major=MAJOR(devnum);//3. register cdev obj

ret =cdev_add(demop, devnum, count);if(ret){gotoERR_STEP1;

}

cls=class_create(THIS_MODULE, DEVNAME);if(IS_ERR(cls)){

ret=PTR_ERR(cls);gotoERR_STEP1;

}for(i = minor; i < (count+minor); i++){

devp= device_create(cls, NULL, MKDEV(major, i), NULL, "%s%d", DEVNAME, i);if(IS_ERR(devp)){

ret=PTR_ERR(devp);gotoERR_STEP2;

}

}return 0;

ERR_STEP2:for(--i; i >= minor; i--){

device_destroy(cls, MKDEV(major, i));

}

class_destroy(cls);

ERR_STEP1:

unregister_chrdev_region(devnum, count);

ERR_STEP:

cdev_del(demop);//get command and pid

printk(KERN_INFO "%s : %s : %d - fail.\n", __FILE__, __func__, __LINE__);returnret;

}static void __exit demo_exit(void)

{inti;//get command and pid

printk(KERN_INFO "%s : %s : %d - leave.\n", __FILE__, __func__, __LINE__);for(i=minor; i < (count+minor); i++){

device_destroy(cls, MKDEV(major, i));

}

class_destroy(cls);

unregister_chrdev_region(MKDEV(major, minor), count);

cdev_del(demop);

}

module_init(demo_init);

module_exit(demo_exit);

下面可以看几个class几个名字的对应关系:

linux设备文件生成,Linux设备文件自动生成(示例代码)相关推荐

  1. asp.net中上传图片并生成小图片,自动添加水印的代码 .

    asp.net中上传图片并生成小图片,自动添加水印的代码 分类: .Net(C#) 2010-03-22 15:28 242人阅读 评论(0) 收藏 举报 /// 上传图片生成缩略图及水印 (来自:h ...

  2. 渗透工具NessusToReport:一个nessus自动报告生成工具,可以用来自动生成nessus扫描器的中文报告--NessusToReport

    Git地址: Hypdncy/NessusToReport: nessus扫描报告自动化生成工具 (github.com) NessusToReport 这是一个nessus自动报告生成工具,可以用来 ...

  3. 微页导出为html文件怎么打开吗,h5自动生成工具(示例代码)

    一.前言 写了很多h5之后,对于写手写html和css已经麻木的我决定动手写个工具自动生成h5结构和样式.其实这个想法由来已久,但总是觉得自己技术不够,所以一直没实行.直到某天我真的写够了,我决定动手 ...

  4. linux下配置jdk11以及生成jre,jdk9以上自动生成jre解决

    jdk9以上之后不会自动生成jre,需要手动进行生成jre. windows下执行: bin\jlink.exe --module-path jmods --add-modules java.desk ...

  5. 织梦cms生成首页html的php文件,织梦DedeCMS定时自动生成首页HTML的实现方法

    只需要制作一个文件然后在首页模板添加一句代码就可以实现让织梦DedeCMS自动生成首页html,具体方法如下: 第一步.需要在首页调用随机文章,这样每次自动更新才会有更新的效果,随机文章调用标签如下: ...

  6. Castor xsd生成java_利用Castor自动生成java文件

    1.编写schema文件,例如:c:castorest.xsd. 2.到http://www.castor.org/网站下载castor-xml.jar(本文使用的是0.9.4版本)及编译所要引用的x ...

  7. 第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类

    之前没有用VS或者在vs中一个源程序写到底,没有使用C++编一个工程 打开VS2015 ,新建VS win32工程,前面步骤很简单,不再阐述 下面直接开始: 新建一个VC++ win32的程序, 在源 ...

  8. 文件夹自动生成html画廊,【桌面自动生成文件夹】桌面自动生成网站_桌面自动生成tmp文件-系统城...

    2017-01-26 13:59:36 浏览量:11190 有的用户发现自己的电脑系统中,总是会在桌面上生成一个名称为MobileFile的文件夹.其实,这个MobileFile文件夹是QQ相关的文件 ...

  9. sql自动生成工具_可自动生成代码,5款基于AI的开发工具

    如今,对机器学习潜力感兴趣的程序员都在讨论,如何使用人工智能和基于人工智能的软件开发工具构建应用程序.例如PyTorch和TensorFlow之类的解决方案. 除此之外,机器学习技术正以另一种有趣的方 ...

  10. linux跑程序内存不够,linux 未跑程序 内存 cache使用过大(示例代码)

    linux与windows不同,会存在缓存内存,通常叫做Cache Memory.有些时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存会很少,此时查看Linux系统 /proc ...

最新文章

  1. MongoDB是个好东西,希望你也会
  2. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战
  3. android DataBind LiveData ViewModel 使用详解
  4. _findnext()调试中断,发生访问错误,错误定位到ntdll.dll
  5. 微型计算机滑动平均值滤波器方程,微型计算机控制技术期末复习2011.ppt
  6. 把一个质量为M0 的物体加速到 时间慢100倍 需要多大能量
  7. selenium速度_RPA UiPath和Selenium,谁是测试套件?
  8. 7 个顶级的 HTML5 Canvas 动画赏析
  9. spring boot项目自定义数据源,mybatisplus分页、逻辑删除无效解决方法
  10. 第一家店开始要做品牌吗?
  11. 《面向对象分析与设计》一1.4面向对象方法的主要优点
  12. 三台服务器的时间同步-Linux
  13. 腾讯自己与自己的战争
  14. 个人认为,载人登陆火星技术上无法实现
  15. Aititi 特征点检测算法与匹配的前世今生与历史传承attilax总结v4
  16. 旋转框目标检测————关于旋转框定义和解决方案
  17. win10重置网络命令_WIN10重置网络的操作方法
  18. 蓄热式加热炉燃烧技术
  19. 球机器人 配重_DIY:拥有绝佳移动力的球平衡机器人
  20. css渐变效果的实现

热门文章

  1. 项目优化到一半还是崩了,新同事换了一套调优方案,全体颤抖。。。
  2. 异步并发利器:实际项目中使用CompletionService提升系统性能的一次实践
  3. java的smalltalk规则,Smalltalk相当于Java的静态是什么?
  4. Java线程通信之等待/通知
  5. ubuntu下用vagrant搭建集群环境
  6. Codeforces-339D. Xenia and Bit Operations
  7. java IO包装流如何关闭
  8. 面试中经常会被问到的70个问题
  9. android bitmap转image
  10. [HDU] 1312Red and Black -用广搜求能探寻到的点的数目