例如
读
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