linux 内核编程之proc虚拟文件系统
生活随笔
收集整理的這篇文章主要介紹了
linux 内核编程之proc虚拟文件系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【版權聲明:轉載請保留出處:blog.csdn.net/gentleliu。郵箱:shallnew*163.com】
在 Linux 設備驅動程序中,驅動工程師自定義/proc 節點以向外界傳遞信息的方法還是比較常見的。
下列函數用于創建/proc 目錄:
struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);下列函數創建/proc 節點:
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent); struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void * data);結合 create_proc_entry()和 proc_mkdir(),可用于先在/proc 下創建一個目錄,而后在該目錄下創建一個文件。
可用如下函數刪除/proc 節點:
void remove_proc_entry(const char *name, struct proc_dir_entry *parent);上述函數各返回值的 proc_dir_entry 結構體中包含了/proc 節點的讀函數指針(read_proc_t*read_proc)、寫函數指針(write_proc_t *write_proc)以及父節點、子節點信息等。/proc 節點的讀寫函數的類型分別為:
typedef int (read_proc_t)(char *page, char **start, off_t off,int count, int *eof, void *data); typedef int (write_proc_t)(struct file *file, const char __user *buffer,unsigned long count, void *data);這兩函數需要我們來實現。
讀函數中 page 指針指向用于寫入數據的緩沖區,start 用于返回實際的數據寫到內存頁的位置,eof 是用于返回讀結束標志,offset 是讀的偏移,count 是要讀的數據長度。start 參數比較復雜,對于/proc 只包含簡單數據的情況,通常不需要在讀函數中設置*start,意味著內核將認為數據保存在內存頁偏移 0 的地方。如果將*start 設置為非 0 值,意味著內核將認為*start 指向的數據是 offset 偏移處的數據。寫函數與 file_operations 中的 write()成員類似,需要一次從用戶緩沖區到內存空間的復制過程。
下面給一個示例,該示例只是簡單的在/proc目錄下創建一個文件夾和文件,用戶可以在用戶態向該文件寫入文件,并讀出文件內容。
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/proc_fs.h> #include <asm/uaccess.h>#define USER_ROOT_DIR "slndir" #define USER_ENTRY "slnfile"struct proc_dir_entry *root_dir, *entry; char kbuff[1024];static int proc_write(struct file *filep, const char __user *buffer,unsigned long len, void *data) {if (copy_from_user(kbuff, buffer, len)) {return -1;}kbuff[len] = '\0';return len; }static int proc_read(char *page, char **start, off_t off, int count, int *eof, void *data) {int len;len = sprintf(page, "%s", kbuff);return len; }static int __init sln_init(void) {printk("Hello, %s\n", __func__);root_dir = proc_mkdir(USER_ROOT_DIR, NULL);if (NULL == root_dir) {printk("proc_mkdir create dir %s failed!\n", USER_ROOT_DIR);return -1;}entry = create_proc_entry(USER_ENTRY, 0666, root_dir);if (NULL == entry) {printk("create_proc_entry create entry %s failed\n", USER_ENTRY);goto err;}entry->read_proc = proc_read;entry->write_proc = proc_write;return 0;err:remove_proc_entry(USER_ROOT_DIR, NULL);return -1; }static void __exit sln_exit(void) {printk("Bye, %s\n", __func__);remove_proc_entry(USER_ENTRY, root_dir);remove_proc_entry(USER_ROOT_DIR, NULL); }module_init(sln_init); module_exit(sln_exit);MODULE_LICENSE("GPL");
總結
以上是生活随笔為你收集整理的linux 内核编程之proc虚拟文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android JNI开发系列(二)He
- 下一篇: linux 其他常用命令