首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux内核中的proc文件系统(3)

Linux内核中的proc文件系统(3)

参数:
       
  • name
你要创建的文件名。
       
  • mode
为创建的文件指定权限
       
  • parent
为你要在哪个文件夹下建立名字为name的文件,如:init_net.proc_net是要在/proc/net/下建立文件。
       
  • proc_fops
为struct file_operations
       
  • data
保存私有数据的指针,如不要为NULL。
例子:
  • ////////////////////////test.c////////////////////////////////////////
  • #include <linux/init.h>   
  • #include <linux/module.h>   
  • #include <linux/types.h>   
  • #include <linux/slab.h>   
  • #include <linux/fs.h>   
  • #include <linux/proc_fs.h>   
  • #include <linux/seq_file.h>   
  • #include <net/net_namespace.h>   
  • #include <linux/mm.h>   

  • MODULE_LICENSE("GPL");   

  • typedef struct {      
  •     int data1;      
  •     int data2;   
  • }ST_Data_Info_Type;   


  • static ST_Data_Info_Type g_astDataInfo[2];   



  • static
    int test_proc_show(struct seq_file *m, void *v)
  • {
  •     ST_Data_Info_Type* pInfo = (ST_Data_Info_Type*)m->private;
  •     if(pInfo != NULL)
  •     {
  •         seq_printf(m, "%d----%d\n", pInfo->data1, pInfo->data2);
  •     }
  •     return 0;
  • }


  • static
    int test_proc_open(struct inode *inode, struct file *file)  
  • {   
  •     return single_open(file, test_proc_show, PDE_DATA(inode));
  • }   


  • static const struct file_operations dl_file_ops = {      
  •     .owner = THIS_MODULE,      
  •     .open    = test_proc_open,
  •     .read    = seq_read,
  •     .llseek  = seq_lseek,
  •     .release = single_release,
  • };   

  • static struct proc_dir_entry *s_pstRootTestDir;


  • void init_mem(void)   
  • {      
  •     /* create /proc/test */
  •     s_pstRootTestDir = proc_mkdir("test", NULL);
  •     if (!s_pstRootTestDir)
  •         return;

  •     g_astDataInfo[0].data1=1;      
  •     g_astDataInfo[0].data2=2;   
  •     proc_create_data("proc_test1", 0644, s_pstRootTestDir, &dl_file_ops, &g_astDataInfo[0]);

  •     g_astDataInfo[1].data1=3;      
  •     g_astDataInfo[1].data2=4;   
  •     proc_create_data("proc_test2", 0644, s_pstRootTestDir, &dl_file_ops, &g_astDataInfo[1]);   
  • }  

  • static
    int __init test_module_init(void)   
  • {   
  •     printk("[test]: module init\n");
  •     init_mem();      
  •     return 0;   
  • }   

  • static void __exit test_module_exit(void)   
  • {   
  •     printk("[test]: module exit\n");
  •     remove_proc_entry("proc_test1", s_pstRootTestDir);      
  •     remove_proc_entry("proc_test2", s_pstRootTestDir);
  •     remove_proc_entry("test", NULL);
  • }   
  • module_init(test_module_init);   
  • module_exit(test_module_exit);
proc_create
说明:创建proc虚拟文件系统文件
函数原型:
  • struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops)
参数:
       
  • name
你要创建的文件名。
       
  • mode
为创建的文件指定权限
       
  • parent
为你要在哪个文件夹下建立名字为name的文件,如:init_net.proc_net是要在/proc/net/下建立文件。
       
  • proc_fops
为struct file_operations
注意:这个接口和proc_create_data的区别在于他不能保存私有数据指针。
PDE_DATA
获取proc_create_data传入的私有数据。
proc_symlink
说明:这个函数在procfs目录下创建一个从name指向dest的符号链接. 它在用户空间等效为ln -s dest name。
函数原型:
  • struct proc_dir_entry *proc_symlink(const char *name, struct proc_dir_entry *parent, const char *dest)
参数:
       
  • name
原始符号。
       
  • parent
符号所在的目录。
       
  • dest
所要创建的符号链接名字。
remove_proc_entry
说明:删除procfs文件系统中的文件或者目录。
函数原型:
  • void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
参数:
       
  • name
要删除的文件或者目录名。
       
  • parent
符号所在的目录,如果为NULL,表示在/proc目录下。
继承事业,薪火相传
返回列表