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://www.pswp.cn/news/922130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922130.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MCP模型上下文協議以及交互流程

1. MCP 是什么全稱&#xff1a;Model Context Protocol定位&#xff1a;讓大語言模型&#xff08;LLM&#xff09;能在“上下文”之外&#xff0c;按統一格式訪問外部數據、調用插件、持久化狀態。動機&#xff1a;以前每家框架&#xff08;LangChain、LlamaIndex 等&#xff0…

MySQLTransactionRollbackException

問題描述mysql部署1主3從&#xff0c;昨天發現主庫有大量報警錯誤&#xff1a;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ; Deadlock found when trying to get lock; …

Redis環境搭建指南:Windows/Linux/Docker多場景安裝與配置

Redis環境搭建指南&#xff1a;Windows/Linux/Docker多場景安裝與配置 1. Redis安裝方式概覽 1.1 安裝方式對比 安裝方式適用場景優點缺點難度Windows直接安裝開發調試安裝簡單&#xff0c;Windows兼容好性能不如Linux&#xff0c;生產不推薦?Linux源碼編譯生產環境性能最佳…

leetcode.80刪除有序數組中的重復項2

題目描述 給你一個有序數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使得出現次數超過兩次的元素只出現兩次 &#xff0c;返回刪除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。…

運動卡新手入門及常見問題處理

1.新手入門1.1 插卡打開包裝&#xff0c;拿出PCI板卡&#xff0c;如下圖&#xff1a;打開電腦機箱蓋&#xff0c;找到PCI插槽&#xff0c;如下圖&#xff08;紅色框部分是PCI槽&#xff0c;有些主板上PCI槽是白色或其他顏色&#xff09;&#xff1a;插入板卡&#xff0c;如下圖…

PRINCE2與PMP項目管理體系對比

在全球范圍內&#xff0c;PRINCE2與PMP是兩大最具影響力的項目管理體系。PRINCE2注重流程和治理結構&#xff0c;強調“控制”與“規范”&#xff1b;而PMP基于PMBOK指南&#xff0c;強調知識體系和方法論的全面性&#xff0c;更關注“工具”與“實踐”。 不同體系的側重點&…

在UniApp跨平臺開發中實現相機自定義濾鏡的鏈式處理架構

以下是進階方案&#xff1a;架構核心設計分層結構$$Pipeline Capture \otimes Filter_1 \otimes Filter_2 \otimes \cdots \otimes Filter_n \otimes Render$$ 其中&#xff1a;$\otimes$ 表示鏈式處理操作符$Capture$ 為原始圖像采集層$Filter_n$ 為可插拔濾鏡單元$Render$ 為…

Mark5 穿越機電調深度解析:設計、選型、控制與實戰(下)

TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+? break;? case 3:? // U - 導通,V - 導通,W + 導通? TIM_SetCompare1 (TIM1, T0); // U-? TIM_SetCompare2 (TIM1, T0); // V-? TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+? break;? case 4:? // U - 導通…

背包問題從入門到入土

我在這里介紹4種常見的背包問題&#xff0c;這里我想按易 --> 難程度從01背包&#xff0c;完全背包&#xff0c;分組背包&#xff0c;多重背包的順序介紹。&#xff08;封面附在最后&#xff09;一&#xff0c;01背包問題&#xff08;后面三個背包問題的基礎&#xff09;01背…

Leetcode 18 java

?????1???????141. 環形鏈表1 題目 ?????1???????141. 環形鏈表 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表…

Linux 正則表達式詳解(基礎 + 擴展 + 實操)

Linux 正則表達式詳解&#xff08;基礎 擴展 實操&#xff09; 正則表達式&#xff08;Regular Expression&#xff0c;簡稱 RE&#xff09;是 Linux 文本處理的核心工具&#xff0c;用于定義字符匹配模式&#xff0c;配合 grep、sed、awk 等工具可實現文本過濾、查找、替換等…

Json-rpc通信項目(基于C++ Jsoncpp muduo庫)

一、介紹RPC RPC&#xff08;Remote Procedure Call&#xff09;遠程過程調用&#xff0c;一種通過網絡從遠程計算器上請求服務&#xff0c;而不需要了解底層網絡通信細節&#xff0c;RPC可以使用多種網絡協議進行通信&#xff0c;并且在TCP/IP網絡四層模型中跨越了傳輸層和應…

RL【9】:Policy Gradient

系列文章目錄 Fundamental Tools RL【1】&#xff1a;Basic Concepts RL【2】&#xff1a;Bellman Equation RL【3】&#xff1a;Bellman Optimality Equation Algorithm RL【4】&#xff1a;Value Iteration and Policy Iteration RL【5】&#xff1a;Monte Carlo Learnin…

Redis是什么?一篇講透它的定位、特點與應用場景

Redis是什么&#xff1f;一篇講透它的定位、特點與應用場景 1. Redis的定義與核心概念 1.1 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09; 是一個開源的、基于內存的數據結構存儲系統&#xff0c;可以用作數據庫、緩存和消息代理。Redis由…

一款免費開源輕量的漏洞情報系統 | 漏洞情報包含:組件漏洞 + 軟件漏洞 + 系統漏洞

工具介紹 bug_search一款免費開源輕量的漏洞情報系統 基于python3 Amis2.9 開發&#xff0c;僅依賴Flask,requests&#xff0c;無需數據庫&#xff0c;Amis是百度開源的低代碼前端框架漏洞情報包含&#xff1a;組件漏洞 軟件漏洞 系統漏洞 增加郵件發送消息報警功能增加釘釘…

詳解在Windows系統中生成ssl證書,實現nginx配置https的方法

目錄一、下載安裝OpenSSL二、證書生成三、修改nginx配置總結Nginx 是一個高性能的HTTP和反向代理web服務器&#xff0c;在進行web項目開發時&#xff0c;大多都是使用nginx對外提供web服務。HTTPS &#xff08;全稱&#xff1a;Hypertext Transfer Protocol Secure [5]&#xf…

AI視覺算法中的OpenCV API (二)

視頻寫入 (FourCC, VideoWriter)? 1. VideoWriter_fourcc - 視頻編碼器四字符代碼 # OpenCV 3.x, 4.x fourcc cv2.VideoWriter_fourcc(M,J,P,G)fourcc cv2.VideoWriter_fourcc(*H264)fourcc cv2.VideoWriter_fourcc(*MJPG) ?FourCC?&#xff1a; 代表 ?Four ?Charac…

分享| 2025年版AIGC數字人實驗室解決方案教學資源解析

AIGC數字人實驗室解決方案構建了涵蓋基礎層、平臺環境層與資源層的多層次教學架構&#xff0c;依托150平方米的實體空間與60人并行授課的規模化支持&#xff0c;為學生提供了技術實踐與創新的高效平臺。其教學資源體系覆蓋AIGC文本生成、圖像生成、數字人應用與智能體開發四大核…

內存大(巨)頁

一、大&#xff08;巨&#xff09;頁 大&#xff08;巨&#xff09;頁&#xff0c;很好理解&#xff0c;就是的大的頁。說這個大頁前&#xff0c;得先把計算機中內存的管理簡單說明一下&#xff0c;否則可能對于一些新手或者把操作系統中內存管理的方法的開發者不太友好。最早的…

langgraph astream使用詳解

langgraph中graph的astream&#xff08;stream&#xff09;方法分別實現異步&#xff08;同步&#xff09;流式應答&#xff0c;在langgraph-api服務也是核心方法&#xff0c;實現與前端的對接&#xff0c;必須要把這個方法弄明白。該方法中最重要的參數是stream_mode&#xff…