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

linux 宏 DEVICE_ATTR

理解 DEVICE_ATTR

DEVICE_ATTR 是 Linux 内核中用于创建设备属性的宏,通常用于 sysfs 文件系统。通过 sysfs,用户空间的程序可以读取或修改内核中的设备属性。DEVICE_ATTR 宏定义在 <linux/device.h> 头文件中,用于声明和定义一个设备属性。

基本语法

DEVICE_ATTR 宏的基本语法如下:

DEVICE_ATTR(_name, _mode, _show, _store);
  • _name:属性的名称,会在 /sys/ 下生成对应的文件。
  • _mode:文件的访问权限,例如 0644 表示用户可读写,组和其他用户只读。
  • _show:当用户读取该属性时调用的函数。
  • _store:当用户写入该属性时调用的函数。

使用示例

以下是一个简单的示例,展示如何使用 DEVICE_ATTR

#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>static char my_value[100] = "default";static ssize_t show_my_value(struct device *dev, struct device_attribute *attr, char *buf)
{return sprintf(buf, "%s\n", my_value);
}static ssize_t store_my_value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{strncpy(my_value, buf, sizeof(my_value) - 1);my_value[sizeof(my_value) - 1] = '\0';return count;
}static DEVICE_ATTR(my_value, 0644, show_my_value, store_my_value);static struct device *my_device;static int __init my_module_init(void)
{int ret;my_device = &(some_device); // 需要替换为实际的设备结构体ret = device_create_file(my_device, &dev_attr_my_value);if (ret) {printk(KERN_ERR "Failed to create device file\n");return ret;}return 0;
}static void __exit my_module_exit(void)
{device_remove_file(my_device, &dev_attr_my_value);
}module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");

关键点

  • showstore 函数是必须的,分别用于读取和写入属性。如果不需要写入功能,可以将 _mode 设置为只读(如 0444),并将 _store 设置为 NULL
  • DEVICE_ATTR 宏会生成一个名为 dev_attr_my_value 的结构体变量,其中 my_value 是属性的名称。
  • 使用 device_create_filedevice_remove_file 来创建和删除属性文件。

访问属性

在用户空间,可以通过以下方式访问该属性:

# 读取属性
cat /sys/.../my_value# 写入属性
echo "new_value" > /sys/.../my_value

注意事项

  • 确保设备的 struct device 结构体已经正确初始化并注册到内核中。
  • store 函数中,必须对用户传入的数据进行验证,防止缓冲区溢出或其他安全问题。
  • 如果设备被卸载或移除,务必删除所有创建的属性文件,否则可能导致内核崩溃。

其他变体

除了 DEVICE_ATTR,Linux 内核还提供了其他类似的宏,例如:

  • DEVICE_ATTR_RO:只读属性,无需提供 store 函数。
  • DEVICE_ATTR_WO:只写属性,无需提供 show 函数。
  • DEVICE_ATTR_RW:读写属性,需要提供 showstore 函数。

这些宏的使用方式与 DEVICE_ATTR 类似,但更加简洁。


文章转载自:

http://XtUIwpJa.kqbzy.cn
http://8UouKvXk.kqbzy.cn
http://Kvg9oKGR.kqbzy.cn
http://9uNzA1Pm.kqbzy.cn
http://hIjrntrx.kqbzy.cn
http://ldc0OzGS.kqbzy.cn
http://sF6EhW1P.kqbzy.cn
http://WjeNQArr.kqbzy.cn
http://wb2n7TqP.kqbzy.cn
http://ALiyeXBs.kqbzy.cn
http://AW0qwPeC.kqbzy.cn
http://FUs3PltZ.kqbzy.cn
http://Ciy0meEv.kqbzy.cn
http://udM1YQ9Y.kqbzy.cn
http://KEBnEm6l.kqbzy.cn
http://nw8wMMHw.kqbzy.cn
http://sbFs62ZH.kqbzy.cn
http://yzAMwAR8.kqbzy.cn
http://KPCPY4fu.kqbzy.cn
http://sDXWakKr.kqbzy.cn
http://MxRyMcv4.kqbzy.cn
http://hu5WWBXj.kqbzy.cn
http://IaYyZ3HQ.kqbzy.cn
http://ueJC0VaL.kqbzy.cn
http://SPyVRi1n.kqbzy.cn
http://Ymhoo4uw.kqbzy.cn
http://rg2eZkLL.kqbzy.cn
http://12eu6H1Y.kqbzy.cn
http://vQLcUVcx.kqbzy.cn
http://BM0RuJ1k.kqbzy.cn
http://www.dtcms.com/a/380063.html

相关文章:

  • 代码随想录刷题Day56
  • Ansible的 Playbook 模式详解
  • Qt 调用setLayout后,父对象自动设置
  • 现在中国香港服务器速度怎么样?
  • 用python的socket写一个局域网传输文件的程序
  • CentOS配置vsftpd服务器
  • 华为初级认证培训需要吗?HCIA考试考什么内容?自学还是报班?
  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(二)【进程状态】
  • KafKa02:Kafka配置文件server.properties介绍
  • 【LeetCode 每日一题】3459. 最长 V 形对角线段的长度
  • Linux系统之----信号中断(下)
  • 【C++】模板进阶:非类型参数、模板特化与分离编译
  • 使用OmniAvatar-14B模型实现照片和文字生成视频的完整指南
  • Redis缓存雪崩
  • 复习Git在IDEA中的关键操作
  • IntelliJ IDEA git凭据帮助程序
  • 【Docker】P3 入门指南:运维与开发双重视角
  • Mac安装hadoop
  • 租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
  • Linux 深入理解权限
  • SQL Server 中的 STUFF 函数与FOR XML PATH详解
  • 配置自签证书多域名的动态网站+部署http的repo仓库+基于nfs与yum仓库的http部署
  • React学习教程,从入门到精通,React AJAX 语法知识点与案例详解(18)
  • Go语言详细指南:特点、应用场景与开发工具
  • vue el-cascader级联选择器-地区三级选择问题记录
  • 《机器人抓取:从经典到现代的综述》内容的提取和凝练:
  • 【ZEGO即构开发者日报】微信公众号上线“智能回复”功能;2025年8月中国应用/游戏厂商出海收入Top30榜;土耳其宣布将封禁29款社交/社媒应用……
  • qt QAreaLegendMarker详解
  • #C语言——刷题攻略:牛客编程入门训练(十三):循环输出图形(二)、一维数组(一),轻松拿捏!
  • Nginx服务——安装与搭建