使用proc文件系统
以下是内核提供的几个重要的proc文件系统接口:
(1)read_proc
- 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
- 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
- void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
remove_proc_entry用于删除上面函数创建的proc条目,参数name给出要删除的proc条目的名称,参数parent指定建立的proc条目所在的目录。
(4)proc_mkdir
- struct proc_dir_entry *proc_mkdir(const char * name, struct proc_dir_entry *parent);
该函数用于创建一个proc目录,参数name用于指定要创建的proc目录的名称,参数parent为该proc目录所在的目录。
在驱动程序中使用proc文件系统,就要了解proc_dir_entry结构:
- struct proc_dir_entry {
- unsigned int low_ino;
- unsigned short namelen;
- const char *name;
- mode_t mode;
- nlink_t nlink;
- uid_t uid; gid_t gid; //进程ID
- loff_t size;
- const struct inode_operations *proc_iops; //结点操作
- const struct file_operations *proc_fops; //文件操作
- get_info_t *get_info;
- struct module *owner; //拥有者
- struct proc_dir_entry *next, *parent, *subdir;
- void *data;
- read_proc_t *read_proc; //读接口
- write_proc_t *write_proc; //写接口
- atomic_t count;/* 引用计数*/
- int pde_users;
- spinlock_t pde_unload_lock;
- struct completion *pde_unload_completion;
- shadow_proc_t *shadow_proc;
- };
例1.9 proc文件系统驱动程序实例
下面的例子演示了如何访问 proc 文件系统。代码见光盘\src\1drivermodel\1-9proc。核心代码如下所示:
- //结点操作
- static struct inode_operations simple_inode_operations = {
- .permission = simple_permission,
- };
- int init_simple_module( void )
- {
- int ret = 0;
- simple_buffer = (char *)vmalloc( MAX_simple_LENGTH );
- if (!simple_buffer)
- {
- ret = -ENOMEM;
- }
- else
- {
- memset( simple_buffer, 0, MAX_LENGTH );
- proc_entry = create_proc_entry( "demo", 0644, NULL );
- if (proc_entry == NULL)
- {
- ret = -ENOMEM;
- vfree(simple_buffer);
- printk(KERN_INFO "demo: Couldn't create proc entry\n");
- }
- else
- {
- proc_entry->proc_iops = &simple_inode_operations;//结点操作
- proc_entry->read_proc = simple_read;
- proc_entry->write_proc = simple_write;
- proc_entry->owner = THIS_MODULE;
- printk(KERN_INFO "demo: Module loaded.\n");
- }
- }
- return ret;
- }
以下是读写操作的框架:
- int simple_read( char *page, char **start, off_t off,int count, int *eof, void *data )
- {
- int size = 0;
- struct task_struct *p;
- char state;
- size+=sprintf(page+size,
- "%5s%7s%7s%7s%7s%7s%7s %s\n\n",
- "PID","UID","PRIO","POLICY",
- "STATE","UTIME","STIME","COMMAND");
- for_each_process(p)
- {
- switch((int)p->state)
- {
- case -1: state='Z'; break;
- case 0: state='R'; break;
- default: state='S'; break;
- }
- size+=sprintf(page+size,
- "%5d%7d%7d%7d%7c%7d%7d %s\n",
- (int)p->pid,
- (int)p->uid,
- (int)p->rt_priority,
- (int)p->policy,
- state,
- (int)p->utime,
- (int)p->stime,
- p->comm);
- }
- return (size);
- }
- ssize_t simple_write( struct file *filp, const char __user *buff,unsigned long len, void *data )
- {
- if(len>MAX_LENGTH)len=MAX_LENGTH;
- if (copy_from_user(simple_buffer, buff, len ))
- {
- return -EFAULT;
- }
- simple_buffer[len] = 0;
- printk(KERN_INFO "simple_write: %s\n",simple_buffer);
- return len;
- }
proc文件的操作权限控制代码:
- static int simple_permission(struct inode *inode, int op, struct nameidata *foo)
- {
- printk(KERN_INFO "simple_permission op %d\n",op);
- if(itype==op)
- {
- return -EACCES;
- }
- return 0;
- }
运行结果如下:
- [root@urbetter /home]# insmod demo.ko
- demo: Module loaded.
- [root@urbetter /home]# cat /proc/demo
- simple_permission op 36
- PID UID PRIO POLICY STATE UTIME STIME COMMAND
- 1 0 0 0 S 1 398 init
- 2 0 0 0 S 0 0 kthreadd
- 3 0 0 0 S 0 0 ksoftirqd/0
- 4 0 99 1 S 0 0 watchdog/0
- 5 0 0 0 S 0 0 events/0
- 6 0 0 0 S 0 41 khelper
- 145 0 0 0 S 0 0 kblockd/0
- 156 0 0 0 S 0 0 khubd
- 159 0 0 0 S 0 0 kseriod
- 163 0 0 0 S 0 4 kmmcd
- 187 0 0 0 S 0 0 pdflush
- 188 0 0 0 S 0 0 pdflush
- 189 0 0 0 S 0 0 kswapd0
- 236 0 0 0 S 0 0 aio/0
- 244 0 0 0 S 0 18 nfsiod
- 924 0 0 0 S 0 0 mtdblockd
- 957 0 0 0 S 0 0 kpsmoused
- 1011 0 0 0 S 0 78 rpciod/0
- 1042 0 0 0 S 0 0 syslogd
- 1045 0 0 0 S 1 7 inetd
- 1079 0 0 0 S 707 468 qpe
- 1088 0 0 0 S 2 13 sh
- 1089 0 0 0 S 0 1 init
- 1090 0 0 0 S 0 0 init
- 1091 0 0 0 S 0 2 init
- 1109 0 0 0 S 41 20 qss
- 1110 0 0 0 S 141 42 quicklauncher
- 1118 0 0 0 R 0 2 cat
- [root@urbetter /home]# echo "fgj">/proc/demo
- simple_permission op 34
- simple_write: fgj
如果将itype配置为34,则屏蔽对/proc/demo的写操作。
- [root@urbetter /home]# insmod demo.ko itype=34
- [root@urbetter /home]# echo "fgj">/proc/demo
- simple_permission op 34
- -/bin/sh: can't create /proc/demo: Permission denied
使用proc文件系统相关推荐
- 使用 /proc 文件系统来访问 Linux 内核的内容
最初开发 /proc 文件系统是为了提供有关系统中进程的信息.但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置. /proc 文件系统包含了一些目录(用作 ...
- proc文件系统编程
proc文件系统是一种虚拟的文件系统,它只存在于内存当中,一般用来在内核中输出一些信息到用户层,通常可以利用其来打印内核程序中的一些调试信息,具体的操作如下代码. #include <linux ...
- 用户空间和内核空间通讯之【proc文件系统】
今天我们介绍另一种用户内核空间通信的方法:proc文件系统. proc文件系统作为linux提供的一种虚拟文件系统并不占用实际外围存储空间,它仅存在于内存中,系统断电即消失.proc文件系统最开始的设 ...
- linux下创建proc文件系统,[转载]Linux下的proc文件系统(转载)
3.调用proc_register把ent加入proc文件系统(即proc文件树)中. 4.返回ent: proc_register函数 这个函数把一个proc文件加入到proc文件树中,其函数原型如 ...
- 初步了解Linux proc文件系统
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口. 用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数. 由 ...
- (转)使用 /proc 文件系统来访问 Linux 内核的内容
转载网址:http://www.ibm.com/developerworks/cn/linux/l-proc.html 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口/proc 文件系统是 ...
- linux+proc+原理,Linux内核中的Proc文件系统(一)
(1)/proc文件系统的特点和/proc文件的说明 /proc文件系统是一种特殊的.由软件创建的文件系统,内核使用它向外界导出信息,/proc系统只存在内存当中,而不占用外存空间. /proc下面的 ...
- linux PROC文件系统详解
/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化.命令procinfo能够显示基于其中某些文件的多种系统信 ...
- 深入理解linux系统下proc文件系统内容
另外,可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 内容摘要:Linux系统上的/proc目录是一 ...
最新文章
- Java虚拟机的静态常量池和运行时常量池
- LeetCode --Search Insert Position
- (转)Unity3DUnity3D在android下调试
- CORS跨域漏洞的学习(防止CSRF漏洞导致的漏洞)
- 如何在github上发起一个pull request
- mongodb 的命令操作(转)
- [py]flask从0到1-模板/增删改查
- 2月中国万网域名总量净增2.1万个 份额突破24%
- 蓝桥杯嵌入式蜂鸣器程序
- 【JS】暑假余额倒计时
- 安信可IDE使用教程 加入阿里云平台
- Web开发技术架构图
- 我的软件开发方法论2:复利方法观
- OpenSSL下载及使用(生成公钥 私钥)
- 三星S8相机黑画面解决
- PostgreSQL 从cmin/cmax到combo cid
- 网页版VIP邮箱有什么宝藏功能?网页邮箱官网注册入口有哪些?
- 帝国cms会员中心1.2
- python接入excel_Excel 借助 Python 连接 WorkBench,实现 Excel 输入参数返回结果
- 护士计算机怎么报名,(湘潭财经)湘潭财经职业技术学校报名计算机|航空|护士护理...
热门文章
- boost::multiprecision模块complex128相关的测试程序
- boost::log::attribute_value用法的测试程序
- boost::sequential_vertex_coloring用法的测试程序
- bgi::detail::is_valid用法的测试程序
- GDCM:gdcm::FileStreamer的测试程序
- GDCM:gdcm::TableReader的测试程序
- Boost:求容器的最小元素和最大元素
- ITK:多输入不同的类型
- DCMTK:数据字典测试程序
- QT的QStandardItemEditorCreator类的使用