以下是内核提供的几个重要的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

使用proc文件系统相关推荐

  1. 使用 /proc 文件系统来访问 Linux 内核的内容

    最初开发 /proc 文件系统是为了提供有关系统中进程的信息.但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置. /proc 文件系统包含了一些目录(用作 ...

  2. proc文件系统编程

    proc文件系统是一种虚拟的文件系统,它只存在于内存当中,一般用来在内核中输出一些信息到用户层,通常可以利用其来打印内核程序中的一些调试信息,具体的操作如下代码. #include <linux ...

  3. 用户空间和内核空间通讯之【proc文件系统】

    今天我们介绍另一种用户内核空间通信的方法:proc文件系统. proc文件系统作为linux提供的一种虚拟文件系统并不占用实际外围存储空间,它仅存在于内存中,系统断电即消失.proc文件系统最开始的设 ...

  4. linux下创建proc文件系统,[转载]Linux下的proc文件系统(转载)

    3.调用proc_register把ent加入proc文件系统(即proc文件树)中. 4.返回ent: proc_register函数 这个函数把一个proc文件加入到proc文件树中,其函数原型如 ...

  5. 初步了解Linux proc文件系统

    proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口. 用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数. 由 ...

  6. (转)使用 /proc 文件系统来访问 Linux 内核的内容

    转载网址:http://www.ibm.com/developerworks/cn/linux/l-proc.html 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口/proc 文件系统是 ...

  7. linux+proc+原理,Linux内核中的Proc文件系统(一)

    (1)/proc文件系统的特点和/proc文件的说明 /proc文件系统是一种特殊的.由软件创建的文件系统,内核使用它向外界导出信息,/proc系统只存在内存当中,而不占用外存空间. /proc下面的 ...

  8. linux PROC文件系统详解

    /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化.命令procinfo能够显示基于其中某些文件的多种系统信 ...

  9. 深入理解linux系统下proc文件系统内容

    另外,可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 内容摘要:Linux系统上的/proc目录是一 ...

最新文章

  1. Java虚拟机的静态常量池和运行时常量池
  2. LeetCode --Search Insert Position
  3. (转)Unity3DUnity3D在android下调试
  4. CORS跨域漏洞的学习(防止CSRF漏洞导致的漏洞)
  5. 如何在github上发起一个pull request
  6. mongodb 的命令操作(转)
  7. [py]flask从0到1-模板/增删改查
  8. 2月中国万网域名总量净增2.1万个 份额突破24%
  9. 蓝桥杯嵌入式蜂鸣器程序
  10. 【JS】暑假余额倒计时
  11. 安信可IDE使用教程 加入阿里云平台
  12. Web开发技术架构图
  13. 我的软件开发方法论2:复利方法观
  14. OpenSSL下载及使用(生成公钥 私钥)
  15. 三星S8相机黑画面解决
  16. PostgreSQL 从cmin/cmax到combo cid
  17. 网页版VIP邮箱有什么宝藏功能?网页邮箱官网注册入口有哪些?
  18. 帝国cms会员中心1.2
  19. python接入excel_Excel 借助 Python 连接 WorkBench,实现 Excel 输入参数返回结果
  20. 护士计算机怎么报名,(湘潭财经)湘潭财经职业技术学校报名计算机|航空|护士护理...

热门文章

  1. boost::multiprecision模块complex128相关的测试程序
  2. boost::log::attribute_value用法的测试程序
  3. boost::sequential_vertex_coloring用法的测试程序
  4. bgi::detail::is_valid用法的测试程序
  5. GDCM:gdcm::FileStreamer的测试程序
  6. GDCM:gdcm::TableReader的测试程序
  7. Boost:求容器的最小元素和最大元素
  8. ITK:多输入不同的类型
  9. DCMTK:数据字典测试程序
  10. QT的QStandardItemEditorCreator类的使用