例如
讀
cat /proc/cpuinfo |
寫
echo fukei-name > /proc/sys/kernel/hostname |
proc 的功能實現
proc 在 c 中是一個結構體來實現的,是 struct proc_dir_entry 。它可以給讀寫綁定到特定的函數上。然后通過別人對 proc 中文件的操作來觸發和回調相應的綁定的函數。
read_proc 和 write_proc 是這個結構體的成員,也是一種結構體。函數就注冊在這個上面。有興趣的同學可以看看 include/linux/proc_fs.h 中的 read_proc_t 和 write_proc_t 的定義。
實現起來也簡單。
struct proc_dir_entry *proc_entry = create_proc_entery(....); int my_read_proc() { } proc_entry->read_proc = my_read_proc(); |
在這的 create_proc_entery 會返回一個 proc_dir_entry 的結構體的引用。失敗就是 NULL 。
這樣,當用戶空間進行 read 的系統調用時,如使用 cat proc 中的內容時。內核會調用注冊到 read_proc 上的這個 my_read_proc 來實現的.
#include <linux/module.h> #include <linux/proc_fs.h> #include <linux/sched.h> #include <linux/mm.h> #define MODULE_NAME "Memory" int my_read_proc( char *page, char **start, off_t off, int count, int *eof, void *data) { struct task_struct *tsk = current; int len; len = sprintf ( page, "This module info: task %s pid %d\n" ,tsk->comm, tsk->pid ); return len; } struct proc_dir_entry *proc_entry; int init_module( void ) { proc_entry = create_proc_entry(MODULE_NAME, 0644, NULL); if (proc_entry==NULL){ remove_proc_entry(MODULE_NAME, NULL); } proc_entry->read_proc = my_read_proc; return 0; } void cleanup_module( void ) { remove_proc_entry(MODULE_NAME, NULL); // 退出和出錯記的刪除 } MODULE_LICENSE( "GPL" ); |
原文轉自:http://blogread.cn/it/article/4630