Linux內核模塊開發(筆記)(3)

發表于:2013-10-14來源:IT博客大學習作者:扶凱點擊數: 標簽:linux
例如 讀 cat /proc/cpuinfo 寫 echo fukei-name /proc/sys/kernel/hostname proc 的功能實現 proc 在 c 中是一個結構體來實現的,是 struct proc_dir_entry 。它可以給讀寫綁定到特

  例如

  讀

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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97