Linux驱动学习 —— 在/sys下面创建目录示例

摘要:
有时我们需要在/sys下创建一些目录。下面给出了一个示例。加载驱动程序模块后,将在/sys_演示的目录下创建一个sysfs,其中创建了多个文件和目录。[ root@tiny4412mnt]#ls-R/sys/sysfs_demo//sys/sysfs-demo/:node_oneode_twosysfs_demo_2/sys/sys fs_demo/sysfs/demo_2:node _ fournode_三个函数中使用的两个函数是:kobject_create_and_add和sysfs_create_group

有时我们需要在/sys下面创建一些目录, 下面给出了一个示例。 在加载驱动模块后, 在/sys下面会创建一个名为sysfs_demo的目录,并在其中在创建几个文件和目录。

[root@tiny4412 mnt]# ls -R /sys/sysfs_demo/
/sys/sysfs_demo/:
node_one      node_two      sysfs_demo_2

/sys/sysfs_demo/sysfs_demo_2:
node_four   node_three

这里用到的两个函数分别是: kobject_create_and_add 和 sysfs_create_group。前一个函数用于在/sys下面创建目录, 后一个函数用于创建文件。

示例驱动:

  1 #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
  2 
  3 #include <linux/init.h>
  4 #include <linux/module.h>
  5 #include <linux/kobject.h>
  6 #include <linux/device.h>
  7 
  8 static struct kobject *k_obj = NULL;
  9 static struct kobject *k_obj_2 = NULL;
 10 
 11 static char node_one_buf[20] = {0};
 12 
 13 static ssize_t sysfs_demo_show_node_one(struct kobject *kobj, struct kobj_attribute *attr, char * buf)
 14 {
 15     pr_info("enter, node: %s
", attr->attr.name);
 16     return sprintf(buf, "%s: %s
", attr->attr.name, node_one_buf);
 17 }
 18 
 19 static ssize_t sysfs_demo_store_node_one(struct kobject *kobj, struct kobj_attribute *attr, const char * buf, size_t n)
 20 {
 21     pr_info("enter, node: %s
", attr->attr.name);
 22 
 23     sprintf(node_one_buf, "%s", buf);
 24 
 25     return n;
 26 }
 27 
 28 static struct kobj_attribute node_one_attribute =
 29     __ATTR(node_one, S_IWUSR|S_IRUGO, sysfs_demo_show_node_one, sysfs_demo_store_node_one);
 30 
 31 static ssize_t sysfs_demo_show_node_two(struct kobject *kobj, struct kobj_attribute *attr, char * buf)
 32 {
 33 
 34     return sprintf(buf, "%s
", attr->attr.name);
 35 }
 36 
 37 static struct kobj_attribute node_two_attribute =
 38     __ATTR(node_two, S_IWUSR|S_IRUGO, sysfs_demo_show_node_two, NULL);
 39 
 40 static struct attribute *sysfs_demo_attributes[] = {
 41     &node_one_attribute.attr,
 42     &node_two_attribute.attr,
 43     NULL
 44 };
 45 
 46 static const struct attribute_group sysfs_demo_attr_group = {
 47     .attrs = sysfs_demo_attributes,
 48 };
 49 
 50 static char node_three_buf[20] = {0};
 51 
 52 static ssize_t sysfs_demo_show_node_three(struct kobject *kobj, struct kobj_attribute *attr, char * buf)
 53 {
 54     pr_info("enter, node: %s
", attr->attr.name);
 55     return sprintf(buf, "%s: %s
", attr->attr.name, node_three_buf);
 56 }
 57 
 58 static ssize_t sysfs_demo_store_node_three(struct kobject *kobj, struct kobj_attribute *attr, const char * buf, size_t n)
 59 {
 60     pr_info("enter, node: %s
", attr->attr.name);
 61 
 62     sprintf(node_three_buf, "%s", buf);
 63 
 64     return n;
 65 }
 66 
 67 static struct kobj_attribute node_three_attribute =
 68     __ATTR(node_three, S_IWUSR|S_IRUGO, sysfs_demo_show_node_three, sysfs_demo_store_node_three);
 69 
 70 static ssize_t sysfs_demo_show_node_four(struct kobject *kobj, struct kobj_attribute *attr, char * buf)
 71 {
 72 
 73     return sprintf(buf, "%s
", attr->attr.name);
 74 }
 75 
 76 static struct kobj_attribute node_four_attribute =
 77     __ATTR(node_four, S_IWUSR|S_IRUGO, sysfs_demo_show_node_four, NULL);
 78 
 79 static struct attribute *sysfs_demo2_attributes[] = {
 80     &node_three_attribute.attr,
 81     &node_four_attribute.attr,
 82     NULL
 83 };
 84 
 85 static const struct attribute_group sysfs_demo2_attr_group = {
 86     .attrs = sysfs_demo2_attributes,
 87 };
 88 
 89 static int __init sysfs_demo_init(void)
 90 {
 91     if ((k_obj = kobject_create_and_add("sysfs_demo", NULL)) == NULL ) {
 92         pr_err("sysfs_demo sys node create error 
");
 93         goto out;
 94     }
 95 
 96     if(sysfs_create_group(k_obj, &sysfs_demo_attr_group) ) {
 97         pr_err("sysfs_create_group failed
");
 98         goto out2;
 99     }
100 
101     if ((k_obj_2 = kobject_create_and_add("sysfs_demo_2", k_obj)) == NULL ) {
102         pr_err("hwinfo sys node create error 
");
103         goto out3;
104     }
105 
106     if(sysfs_create_group(k_obj_2, &sysfs_demo2_attr_group) ) {
107         pr_err("sysfs_create_group failed
");
108         goto out4;
109     }
110 
111     pr_info("enter.
");
112     return 0;
113 out4:
114     kobject_put(k_obj_2);
115 out3:
116     sysfs_remove_group(k_obj, &sysfs_demo_attr_group);
117 out2:
118     kobject_put(k_obj);
119 out:
120     return -1;
121 }
122 module_init(sysfs_demo_init);
123 
124 static void __exit sysfs_demo_exit(void)
125 {
126     pr_info("enter.
");
127 
128     if (k_obj) {
129         sysfs_remove_group(k_obj, &sysfs_demo_attr_group);
130         if (k_obj_2) {
131             sysfs_remove_group(k_obj_2, &sysfs_demo2_attr_group);
132             kobject_put(k_obj_2);
133         }
134         kobject_put(k_obj);
135     }
136 
137 }
138 module_exit(sysfs_demo_exit);
139 
140 MODULE_LICENSE("GPL");

免责声明:文章转载自《Linux驱动学习 —— 在/sys下面创建目录示例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HDU 3280 Equal Sum Partitions(二分查找)常用CentOS 6/7 扩展源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux系统磁盘管理(磁盘阵列)

1、磁盘阵列简介 RAID(Redundant Array of Independent Disks)即独立硬盘冗余阵列,简称磁盘阵列。磁盘阵列是由很多价格较便宜的磁盘,以硬件(RAID卡)或软件(MDADM)形式组合成一个容量巨大的磁盘组,利用多个磁盘组合在一起,提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。其中RAID...

Linux下常用小工具、命令行

查看CPU信息 CPU全部信息:cat /proc/cpuinfo支持的指令集:cat /proc/cpuinfo | grep flags 运行状态监视 indicator-sysmonitor:可以监视CPU、内存占用率;网速;电池电量;IP;硬盘剩余大小。可以显示在状态栏,很方便。安装方法: sudo add-apt-repository pp...

linux同步windows的时间

找了很多的资料,都没有windows做时间服务,linux同步windows的时间的,最后自己找了一些软件,终于搞定了,写出来给大家共享,以免大家多走弯路   首先在http://www.meinberg.de/english/sw/index.htm   下载了一个windows的NTP服务程序:ntp4171.zip   windows 192.168...

第四季-专题10-字符设备驱动模型

专题10-字符设备驱动模型 第1课-使用字符驱动程序 编译/安装驱动 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码。因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块。 例子:字符设备驱动程序 编写makefile文件:        obj-m := memdev.o KDIR := /home/S5-driver/les...

Linux系统扩容根目录磁盘空间的操作方法

一、使用背景 Linux根目录磁盘空间不够用了,当修改了虚拟机模版增加磁盘大小或者插入了一块新硬盘,但是发现系统里的大小还是没改变。 产生的原因是没有给磁盘格式化,没有增加分区。 二、操作方法 1. 查看磁盘空间大小,使用df -h 命令,发现挂载根目录节点的/dev/mapper/ubuntu14--vg-root 只有28G容量。 1 2 3 4...

Node 之URL模块

首先在控制台(终端)开启Node模式,并打印出url来看一下:   从图中可以看出,它有 Url、parse、resolve、resolveObject、format、URL、URLSearchParams、domainToASCII、domainToUnicode 这么多模块。 那么这些模块有什么用呢? 我们来看看最终的效果: 首先输入http://lo...