linux 内核编程之proc虚拟文件系统
生活随笔
收集整理的這篇文章主要介紹了
linux 内核编程之proc虚拟文件系统
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【版權(quán)聲明:轉(zhuǎn)載請(qǐng)保留出處:blog.csdn.net/gentleliu。郵箱:shallnew*163.com】
在 Linux 設(shè)備驅(qū)動(dòng)程序中,驅(qū)動(dòng)工程師自定義/proc 節(jié)點(diǎn)以向外界傳遞信息的方法還是比較常見(jiàn)的。
下列函數(shù)用于創(chuàng)建/proc 目錄:
struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);下列函數(shù)創(chuàng)建/proc 節(jié)點(diǎn):
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);結(jié)合 create_proc_entry()和 proc_mkdir(),可用于先在/proc 下創(chuàng)建一個(gè)目錄,而后在該目錄下創(chuàng)建一個(gè)文件。
可用如下函數(shù)刪除/proc 節(jié)點(diǎn):
void remove_proc_entry(const char *name, struct proc_dir_entry *parent);上述函數(shù)各返回值的 proc_dir_entry 結(jié)構(gòu)體中包含了/proc 節(jié)點(diǎn)的讀函數(shù)指針(read_proc_t*read_proc)、寫(xiě)函數(shù)指針(write_proc_t *write_proc)以及父節(jié)點(diǎn)、子節(jié)點(diǎn)信息等。/proc 節(jié)點(diǎn)的讀寫(xiě)函數(shù)的類(lèi)型分別為:
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);這兩函數(shù)需要我們來(lái)實(shí)現(xiàn)。
讀函數(shù)中 page 指針指向用于寫(xiě)入數(shù)據(jù)的緩沖區(qū),start 用于返回實(shí)際的數(shù)據(jù)寫(xiě)到內(nèi)存頁(yè)的位置,eof 是用于返回讀結(jié)束標(biāo)志,offset 是讀的偏移,count 是要讀的數(shù)據(jù)長(zhǎng)度。start 參數(shù)比較復(fù)雜,對(duì)于/proc 只包含簡(jiǎn)單數(shù)據(jù)的情況,通常不需要在讀函數(shù)中設(shè)置*start,意味著內(nèi)核將認(rèn)為數(shù)據(jù)保存在內(nèi)存頁(yè)偏移 0 的地方。如果將*start 設(shè)置為非 0 值,意味著內(nèi)核將認(rèn)為*start 指向的數(shù)據(jù)是 offset 偏移處的數(shù)據(jù)。寫(xiě)函數(shù)與 file_operations 中的 write()成員類(lèi)似,需要一次從用戶(hù)緩沖區(qū)到內(nèi)存空間的復(fù)制過(guò)程。
下面給一個(gè)示例,該示例只是簡(jiǎn)單的在/proc目錄下創(chuàng)建一個(gè)文件夾和文件,用戶(hù)可以在用戶(hù)態(tài)向該文件寫(xiě)入文件,并讀出文件內(nèi)容。
#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");
總結(jié)
以上是生活随笔為你收集整理的linux 内核编程之proc虚拟文件系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android JNI开发系列(二)He
- 下一篇: java 文件输出流_Java 文件输出