日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 内核编程之proc虚拟文件系统

發布時間:2023/12/10 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 内核编程之proc虚拟文件系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【版權聲明:轉載請保留出處:blog.csdn.net/gentleliu。郵箱:shallnew*163.com】


在 Linux 系統中,/proc 文件系統十分有用,它被用于內核向用戶導出信息。/proc 文件系統是一個虛擬文件系統,通過它可以使用一種新的方法在 Linux 內核空間和用戶空間之間進行通信。在/proc 文件系統中,我們可以將對虛擬文件的讀寫作為與內核中實體進行通信的一種手段,與普通文件不同的是,這些虛擬文件的內容都是動態創建的。Linux 系統的許多命令本身都是通過分析/proc 下的文件來完成,如 ps、top、uptime 和 free等。
在 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虚拟文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。