使用proc文件系统

以下是内核提供的几个重要的proc文件系统接口:

(1)read_proc

  1. int (*read_proc)(char *page, char **start, off_t offset, int count, int *eof, void *data); 

read_proc是proc文件输出信息接口,page是将要写入数据的缓冲区指针,start是数据将要写入的页面位置,offset是页面中的偏移量;count是写入的字节数,eof是一个整形数,当没有更多数据时,必须配置这个参数,data是驱动程序特定的数据指针,可用于内部使用。函数的返回值表示实际放入页面缓冲区的数据字节数。

(2)create_proc_entry

  1. struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent); 

create_proc_entry用来创建proc目录。其中name为文件名称;mode为文件权限;parent为文件的父目录的指针,它为null时代表父目录为/proc。

(3)remove_proc_entry

  1. void remove_proc_entry(const char *name, struct proc_dir_entry *parent); 

remove_proc_entry用于删除上面函数创建的proc条目,参数name给出要删除的proc条目的名称,参数parent指定建立的proc条目所在的目录。

(4)proc_mkdir

  1. struct proc_dir_entry *proc_mkdir(const char * name, struct proc_dir_entry *parent); 

该函数用于创建一个proc目录,参数name用于指定要创建的proc目录的名称,参数parent为该proc目录所在的目录。

在驱动程序中使用proc文件系统,就要了解proc_dir_entry结构:

  1. struct proc_dir_entry {  
  2.     unsigned int low_ino;  
  3.     unsigned short namelen;  
  4.     const char *name;  
  5.     mode_t mode;  
  6.     nlink_t nlink;  
  7.     uid_t uid; gid_t gid;               //进程ID  
  8.     loff_t size;  
  9.     const struct inode_operations *proc_iops;   //结点操作  
  10.     const struct file_operations *proc_fops;    //文件操作  
  11.     get_info_t *get_info;  
  12.     struct module *owner;               //拥有者  
  13.     struct proc_dir_entry *next, *parent, *subdir;  
  14.     void *data;  
  15.     read_proc_t *read_proc;         //读接口  
  16.     write_proc_t *write_proc;           //写接口  
  17.     atomic_t count;/* 引用计数*/  
  18.     int pde_users;  
  19.     spinlock_t pde_unload_lock;  
  20.     struct completion *pde_unload_completion;  
  21.     shadow_proc_t *shadow_proc;  
  22. };  

例1.9  proc文件系统驱动程序实例

下面的例子演示了如何访问 proc 文件系统。代码见光盘\src\1drivermodel\1-9proc。核心代码如下所示:

  1. //结点操作  
  2. static struct inode_operations simple_inode_operations = {  
  3.     .permission = simple_permission,  
  4. };  
  5. int init_simple_module( void )  
  6. {  
  7.     int ret = 0;  
  8.     simple_buffer = (char *)vmalloc( MAX_simple_LENGTH );  
  9.     if (!simple_buffer)   
  10.     {  
  11.         ret = -ENOMEM;  
  12.     }   
  13.     else   
  14.     {  
  15.         memset( simple_buffer, 0, MAX_LENGTH );  
  16.         proc_entry = create_proc_entry( "demo", 0644, NULL );  
  17.         if (proc_entry == NULL)  
  18.         {  
  19.             ret = -ENOMEM;  
  20.             vfree(simple_buffer);  
  21.             printk(KERN_INFO "demo: Couldn't create proc entry\n");  
  22.         }   
  23.         else  
  24.         {  
  25.             proc_entry->proc_iops = &simple_inode_operations;//结点操作  
  26.             proc_entry->read_proc = simple_read;  
  27.             proc_entry->write_proc = simple_write;  
  28.             proc_entry->owner = THIS_MODULE;  
  29.             printk(KERN_INFO "demo: Module loaded.\n");  
  30.         }  
  31.     }  
  32.     return ret;  
  33. }  
  34. 以下是读写操作的框架:

    1. int simple_read( char *page, char **start, off_t off,int count, int *eof, void *data )  
    2. {  
    3.     int size = 0;  
    4.     struct task_struct *p;  
    5.     char state;  
    6.     size+=sprintf(page+size,  
    7.         "%5s%7s%7s%7s%7s%7s%7s  %s\n\n",  
    8.         "PID","UID","PRIO","POLICY",  
    9.         "STATE","UTIME","STIME","COMMAND");  
    10.     for_each_process(p)  
    11.     {  
    12.         switch((int)p->state)  
    13.         {  
    14.         case -1: state='Z'; break;  
    15.         case 0: state='R'; break;  
    16.         default: state='S'; break;  
    17.         }  
    18.         size+=sprintf(page+size,  
    19.             "%5d%7d%7d%7d%7c%7d%7d  %s\n",  
    20.             (int)p->pid,  
    21.             (int)p->uid,  
    22.             (int)p->rt_priority,  
    23.             (int)p->policy,  
    24.             state,  
    25.             (int)p->utime,  
    26.             (int)p->stime,  
    27.             p->comm);  
    28.     }  
    29.     return (size);  
    30. }  
    31. ssize_t simple_write( struct file *filp, const char __user *buff,unsigned long len, void *data )  
    32. {  
    33.     if(len>MAX_LENGTH)len=MAX_LENGTH;  
    34.     if (copy_from_user(simple_buffer, buff, len ))  
    35.     {  
    36.         return -EFAULT;  
    37.     }  
    38.     simple_buffer[len] = 0;  
    39.     printk(KERN_INFO "simple_write: %s\n",simple_buffer);  
    40.     return len;  
    41. }  

    proc文件的操作权限控制代码:
    1. static int simple_permission(struct inode *inode, int op, struct nameidata *foo)  
    2. {  
    3.     printk(KERN_INFO "simple_permission op %d\n",op);  
    4.     if(itype==op)  
    5.     {  
    6.         return -EACCES;  
    7.     }  
    8.     return 0;  
    9. }  

    运行结果如下:
    1. [root@urbetter /home]# insmod demo.ko   
    2. demo: Module loaded.  
    3. [root@urbetter /home]# cat /proc/demo  
    4. simple_permission op 36  
    5.   PID    UID   PRIO POLICY  STATE  UTIME  STIME  COMMAND  
    6.     1      0      0      0      S      1    398  init  
    7.     2      0      0      0      S      0      0  kthreadd  
    8.     3      0      0      0      S      0      0  ksoftirqd/0  
    9.     4      0     99      1      S      0      0  watchdog/0  
    10.     5      0      0      0      S      0      0  events/0  
    11.     6      0      0      0      S      0     41  khelper  
    12.   145      0      0      0      S      0      0  kblockd/0  
    13.   156      0      0      0      S      0      0  khubd  
    14.   159      0      0      0      S      0      0  kseriod  
    15.   163      0      0      0      S      0      4  kmmcd  
    16.   187      0      0      0      S      0      0  pdflush  
    17.   188      0      0      0      S      0      0  pdflush  
    18.   189      0      0      0      S      0      0  kswapd0  
    19.   236      0      0      0      S      0      0  aio/0  
    20.   244      0      0      0      S      0     18  nfsiod  
    21.   924      0      0      0      S      0      0  mtdblockd  
    22.   957      0      0      0      S      0      0  kpsmoused  
    23.  1011      0      0      0      S      0     78  rpciod/0  
    24.  1042      0      0      0      S      0      0  syslogd  
    25.  1045      0      0      0      S      1      7  inetd  
    26.  1079      0      0      0      S    707    468  qpe  
    27.  1088      0      0      0      S      2     13  sh  
    28.  1089      0      0      0      S      0      1  init  
    29.  1090      0      0      0      S      0      0  init  
    30.  1091      0      0      0      S      0      2  init  
    31.  1109      0      0      0      S     41     20  qss  
    32.  1110      0      0      0      S    141     42  quicklauncher  
    33.  1118      0      0      0      R      0      2  cat  
    34. [root@urbetter /home]# echo "fgj">/proc/demo  
    35. simple_permission op 34  
    36. simple_write: fgj  

    如果将itype配置为34,则屏蔽对/proc/demo的写操作。
    1. [root@urbetter /home]# insmod demo.ko itype=34 
    2. [root@urbetter /home]# echo "fgj">/proc/demo  
    3. simple_permission op 34  
    4. -/bin/sh: can't create /proc/demo: Permission denied  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值