sysfs中属性文件的建立
1、device中建立属性文件
(1)函数调用关系:
/**************************************************************/
device_create_file
sysfs_create_file
/*************************************************************/
(2)相关的数据结构:
struct attribute {
const char *name; // 属性文件的名字
struct module *owner; // 属性文件的所有者
mode_t mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lock_class_key *key;
struct lock_class_key skey;
#endif
};
struct device_attribute {
struct attribute attr; // 内置的attribute 结构体
ssize_t (*show)(struct device *dev, struct device_attribute *attr, // 属性文件的show方法(也就是读)
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr, // 属性文件的store方法(也就是写)
const char *buf, size_t count);
};
(3) 相关的宏定义
/**************************************************************/
#define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
#define __ATTR(_name,_mode,_show,_store) { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
.show = _show,
.store = _store,
/*************************************************************/
由此可知这个宏定义就是定义了一个 device_attribute 类型的变量并进行了初始化。
总结:我们如果需要给device添加属性文件,那么我们可以通过device_create_file函数去添加,我们需要提供相应的device属性文件描述信息,
也就是一个device_attribute 结构体变量。
2、class建立属性文件
(1)函数调用关系
/**********************************************************/
class_create_file
sysfs_create_file
/***********************************************************/
(2)相关的数据结构
struct class_attribute {
struct attribute attr; // 内置的 attribute 结构体变量
ssize_t (*show)(struct class *class, struct class_attribute *attr, // 属性文件的show操作方法
char *buf);
ssize_t (*store)(struct class *class, struct class_attribute *attr, // 属性文件的store操作方法
const char *buf, size_t count);
};
(3)相关的宏定义
/******************************************************************************/
#define CLASS_ATTR(_name, _mode, _show, _store) \
struct class_attribute class_attr_##_name = __ATTR(_name, _mode, _show, _store)
/******************************************************************************/
3、bus建立属性文件
(1)函数调用关系
/**********************************************************/
bus_create_file
sysfs_create_file
/*********************************************************/
(2)相关的数据结构
struct bus_attribute {
struct attribute attr;
ssize_t (*show)(struct bus_type *bus, char *buf);
ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};
(3)相关的宏定义
#define BUS_ATTR(_name, _mode, _show, _store) \
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
4、一次建立多个属性文件的方法
上面说的那些函数一次只能建立一个属性文件,其实在内核中还提供了另一个可以一次建立多个属性文件的函数,所以既然是建立多个,那么我们肯定是需要提供相应的数组。
(1)一次建立多个device属性
static int device_add_attributes(struct device *dev, struct device_attribute *attrs)
(2)一次建立多个bus属性文件
static int device_add_attrs(struct bus_type *bus, struct device *dev)
/*************************************************************************************/
sysfs中属性文件的建立的更多相关文章
- Spring中属性文件properties的读取与使用
实际项目中,通常将一些可配置的定制信息放到属性文件中(如数据库连接信息,邮件发送配置信息等),便于统一配置管理.例中将需配置的属性信息放在属性文件/WEB-INF/configInfo.propert ...
- JAVA 中加载属性文件的4种方法
小总结 : 这个集合属性可以反序列化, 把持久化数据读出来, 输入流中放入要操作的文件! p.load加载这个输入流! p.getProperty( key) 根据这个键获得值! 补充 : web工程 ...
- Spring的属性文件properties使用注意
Spring的属性文件properties使用注意 Spring 中属性文件的配置 通常我们会使用properties文件来设置一些属性,如数据库连接信息,避免进行硬编码, <bean clas ...
- JDBC程序优化--提取配置信息放到属性文件中
JDBC程序优化--提取配置信息放到属性文件中 此处仅仅优化JDBC连接部分,代码如下: public class ConnectionFactory { private static String ...
- Spring基础—— 在 Spring Config 中使用外部属性文件
一.在 Spring Config 文件中配置 Bean 时,有时候需要在 Bean 的配置里添加 系统部署的细节信息, 如文件路径,数据源配置信息.而这些部署细节实际上需要在配置文件外部来定义. 二 ...
- Spring中使用属性文件properties的两种方式
实际项目中,通常将可配置的参数放到属性文件中,例如数据库连接信息.redis连接信息等,便于统一管理.然后通过IoC框架spring将其加载到上下文中,使得程序可以直接使用. 创建mysql.prop ...
- Java - 得到项目中properties属性文件中定义的属性值
public static String getPropertiesValue(String fileName, String key) { return ResourceBundle.getBu ...
- Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。
Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可.
- Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件
1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...
随机推荐
- Learning Query and Document Similarities from Click-through Bipartite Graph with Metadata
读了一篇paper,MSRA的Wei Wu的一篇<Learning Query and Document Similarities from Click-through Bipartite Gr ...
- C#反射——简单反射操作类的封装
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Re ...
- Mac下将C程序创建为动态链接库再由另一个C程序调用
写C的时候需要调用之前的一个C程序,想用动态链接库的方式.Mac下的动态链接库是dylib,与Linux下的.os或Windows下的.dll不同.由于之前没有接触过,所以翻了大量的博客,然而在编译过 ...
- linux下如何kill tty终端
答:一共有两个步骤,如下: 1.列出打开的终端 who 2.kill需要kill的tty终端 pkill -kill -t pts/2
- SDN原理 OpenFlow协议 -4
通道 Channel 在前面的OpenFlow的内容中,我们提到了在交换层所采用的流表是控制层的Controller下发的,那么Controller是如何下发流表的呢?中间经过了哪些的流程和步骤?控制 ...
- UVa 11732 strcmp()函数(左孩子右兄弟表示法)
#include<iostream> #include<algorithm> #include<string> #include<cstring> #i ...
- Chain of Responsibility(责任链)
意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性: 有多个的对象可以处理一个请求,哪个对 ...
- JavaScript权威指南--Javascript子集和扩展
知识要点 本章讨论javascript的子集和超集,其中子集的定义大部分处于安全考虑.只有使用这门语言的一个安全的子集编写脚本,才能让代码执行的更安全.更稳定.比如如何更安全地执行一段由不可信第三方提 ...
- 何时使用MQ ?
何时使用MQmq作为一种基础中间件在互联网项目中有着大量的使用. 一种技术的产生自然是为了解决某种需求,通常来说是以下场景: 需要跨进程通信:B系统需要A系统的输出作为输入参数.当A系统的输出能力远远 ...
- HDU-4550-贪心
卡片游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...