in Linux, proc文件系统是一个虚拟文件系统,用户和应用程序可以通过proc文件系统得到当前的一些系统信息,并可以改变一些内核的参数。/proc下的文件是一种特殊文件,不能够像一般文件一样创建删除。

如果要创建一个 proc 文件,并且不用 proc_fs 默认提供的 file_operations 的话,可以使用 proc_create() 这个函数(见方法二),通过最后一个参数来指定要创建的 proc 文件的 file_operations。

每个 proc 文件也都会用到 file_operations,在调用 create_proc_entry() 创建 proc 文件时,其中一步是调用 proc_register(),proc_register() 会为 proc_dir_entry 提供一个默认的 file_operations,而 proc_create() 与 create_proc_entry() 唯一差别就是在调用 proc_register() 前先设置好 proc_dir_entry 的 file_operations,这样在 proc_register() 时就不会设置使用 proc_fs 默认的 file_operations 了。

下面使用两种方法来讨论proc文件的创建、删除与读写,不论使用哪种方法创建proc文件,创建目录的方法都是使用proc_mkdir函数,如果" /proc/driver " 已存在,可直接在其目录下创建proc文件,指定文件名"driver/key", 如果/proc/dirver目录不存在,将不能成功创建指定文件名"driver/key"对应的proc文件(/proc/driver/key)。

方法一:(create_proc_entry创建proc文件)

1.1 .创建目录:

[c] view plaincopy
  1. struct proc_dir_entry *proc_mkdir(const char *name,
  2. struct proc_dir_entry *parent);

1.2 .创建proc文件:

[c] view plaincopy
  1. struct proc_dir_entry *create_proc_entry( const char *name,  mode_t mode,
  2. struct proc_dir_entry *parent );

create_proc_entry函数用于创建一个一般的proc文件,其中name是文件名,比如“hello”,mode是文件模式,parent是要创建的proc文件的父目录(若parent = NULL则创建在/proc目录下)。

1.3 .删除proc文件/目录:

[c] view plaincopy
  1. void remove_dir_entry(const char *name, struct proc_dir_entry *parent);

参数同proc_mkdir()函数类似

1.4 .创建可读写的proc文件

proc文件实际上是一个叫做proc_dir entry的struct(定义在proc_fs.h),该struct中有int read_proc和int write_proc两个元素,要实现proc的文件的读写就要给这两个元素赋值。但这里不是简单地将一个整数赋值过去就行了,需要实现两个回调函数。

在用户或应用程序访问该proc文件时,就会调用这个函数,实现这个函数时只需将想要让用户看到的内容放入page即可。

写回调函数原型:int mod_write( struct file *filp, const char __user *buff, unsigned long len, void *data );

在用户或应用程序试图写入该proc文件时,就会调用这个函数,实现这个函数时需要接收用户写入的数据(buff参数)。

写一个模块测试proc文件的读写:

[c] view plaincopy
  1. #include linux/module.h
  2. #include linux/kernel.h
  3. #include linux/proc_fs.h
  4. #include linux/sched.h
  5. #include asm/uaccess.h
  6. #define STRINGLEN 1024
  7. char global_buffer[STRINGLEN];
  8. struct proc_dir_entry *example_dir, *hello_file;
  9. int proc_read_hello(char *page, char **start, off_t off, int count, int *eof,
  10. void *data) {
  11. int len;
  12. len = sprintf(page, global_buffer); //把global_buffer的内容显示给访问者
  13. return len;
  14. }
  15. int proc_write_hello(struct file *file, const char *buffer, unsigned long count,
  16. void *data) {
  17. int len;
  18. if (count = STRINGLEN)
  19. len = STRINGLEN – 1;
  20. else
  21. len = count;
  22. /*
  23. * copy_from_user函数将数据从用户空间拷贝到内核空间
  24. * 此处将用户写入的数据存入global_buffer
  25. */
  26. copy_from_user(global_buffer, buffer, len);
  27. global_buffer[len] = \0′;
  28. return len;
  29. }
  30. static int __init proc_test_init(void) {
  31. example_dir = proc_mkdir("proc_test", NULL);
  32. hello_file = create_proc_entry("hello", S_IRUGO, example_dir);
  33. strcpy(global_buffer, "hello");
  34. hello_file->read_proc = proc_read_hello;
  35. hello_file->write_proc = proc_write_hello;
  36. return 0;
  37. }
  38. static void __exit proc_test_exit(void) {
  39. remove_proc_entry("hello", example_dir);
  40. remove_proc_entry(“proc_test”, NULL);
  41. }
  42. module_init(proc_test_init);
  43. module_exit(proc_test_exit);

写入proc文件

echo "Hello from kernel" /proc/proc_test/hello'

读取proc文件内容,将看到屏幕上显示了我们写入的字符串:Hello from kernel

cat /proc/proc_test/hello
 
<strong><span style="font-size: 18px;">方法二:(proc_create创建proc文件)</span></strong>

proc_create() 一般在创建使用 seq_file 接口的proc 文件时使用。 其中seq_file接口定义在#include<linux/seq_file.h>中,如果open函数使用了single_open,release函数必须为single_release

proc_create函数原型: struct proc_dir_entry *proc_create(const char *name, mode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops)

2.1 .创建目录:

[c] view plaincopy
  1. struct proc_dir_entry *proc_mkdir(const char *name,
  2. struct proc_dir_entry *parent);

2.2.创建文件:

static int proc_show_ver(struct seq_file *file, void *v)
{
 int cnt = 0;
 seq_printf(file, "Driver: %s\n", DRV_NAME);    /*函数seq_printf是最常用的输出函数,它用于把给定参数按照给定的格式输出到seq_file文件*/
 seq_printf(file, "Author: %s\n", AUTH);
 seq_printf(file, "Version: %s\n", VER);
 seq_printf(file, "Time: %s %s\n", __DATE__, __TIME__);
 return cnt; 
}

static int proc_key_open(struct inode *inode, struct file *file)
{
 single_open(file, proc_show_ver, NULL);  /*将proc_show_ver 和 seq_file文件关联起来*/
 return 0;
}

static struct file_operations proc_file_ops = {
 .owner   = THIS_MODULE,
 .open     = proc_key_open
 .read     = seq_read,     /*定义在linux/seq_file.c*/
 .release = single_release,  /*定义在linux/seq_file.c*/
};

ver_proc = proc_create(PROC_NAME, 0, NULL, &proc_file_ops);

2.3 删除proc文件(和方法一相同)

remove_proc_entry(PROC_NAME, NULL);

2.4 proc文件使用 (和方法一相同)

按照上述的代码,仅能够察看proc文件,cat /proc/PROC_NAME

几点注意:

proc 项创建时要避免已经存在同名的 proc 项,否则注册时内核会报错(但还是会成功返回那个 proc 项),在删除时有时会删不掉(尤其是 proc 目录)。
删除一个 proc 目录会把这个目录所有的 proc 文件都删除。

linux下proc文件的读写(部分转载)相关推荐

  1. Linux下各文件夹的结构说明及用途介绍(转载)

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...

  2. Linux下利用文件描述符恢复的成功失败实验

    数据误删除是作为初级运维人员常常遇到的"低级错误",一些有经验的老手有时也在疲劳.不冷静的情况下"马失前蹄".一旦误删除数据文件,尽快采用影响最小.最迅速的手段 ...

  3. linux下测试磁盘的读写IO速度-简易方法

    linux下测试磁盘的读写IO速度-简易方法 参考资料: https://blog.csdn.net/zqtsx/article/details/25487185 一:使用hdparm命令 这是一个是 ...

  4. linux下查看文件的权限,Linux下查看文件权限、修改文件权限的方法

    查看权限命令查看目录的相关权限可以采用命令ls -lD,或者直接用ls -la 如 ls -l www.jb51.net  //这里表示查看www.jb51.net目录 修改权限命令 chmod 77 ...

  5. Linux下的C编程实战(转载)

    http://www.cnblogs.com/alexusli/archive/2008/10/24/1318736.html Linux下的C编程实战(转载) (转自)http://www.cnbl ...

  6. linux core文件默认位置,linux下core文件

    linux下core文件 参考:http://www.cnblogs.com/li-hao/archive/2011/09/25/2190278.html 并整合其他参考资料 在程序不寻常退出时,内核 ...

  7. linux 下删除文件的 操纵

    linux   下删除 文件的 方法::: 1-  remove remove(删除文件) 相关函数 link,rename,unlink 表头文件 #include<stdio.h> 定 ...

  8. Linux下查看文件占用空间大小的du 和df 命令

    Linux下查看文件占磁盘大小一般使用du或df命令 df命令:用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. du命令 ...

  9. linux下查看系统socket读写缓冲区

    一:linux下查看系统socket读写缓冲区大小配置: http://blog.csdn.net/herecles/article/details/8146017 1. tcp 收发缓冲区默认值 [ ...

  10. 粗谈LINUX下的文件系统管理

    在各网络操作系统中,都可分为系统理与网络管理两部分,而在LINUX下,若要向系统管理方面发展的话,就必须了解LINUX下的用户管理与文件管理.前面己经介绍了用户管理,下面将粗谈一下LINUX下的文件系 ...

最新文章

  1. 动画代码Android动画学习笔记动画代码
  2. restful get不传参数404_你知道什么是 Restful 风格吗?SpringMVC 带我们实现它!
  3. HTML min/maxlength
  4. 思科路由器2811如何重设密码
  5. 转载的发现对自己非常有用,来分享给大家
  6. 硬核AI开发者大会来袭:飞桨发布开源框架2.0 RC版、生物计算平台PaddleHelix「螺旋桨」...
  7. 梦参老和尚:糊涂人念〈大悲咒〉往生的故事
  8. Python写的我的世界源码
  9. android WebView多标签,加速解决卡顿,视频播放笔记
  10. 龙芯平台OsTools-Gmac更新
  11. BUCT c语言程序设计基础第三篇10~20道题(上)
  12. shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)
  13. canvas图片绘制-两张图片的叠加
  14. Windows Server网络操作系统安装
  15. SEO是什么意思 - SEO优化具体怎么做?
  16. 实现海康监控视频播放(录像回放)(抓拍,录像等功能)
  17. 欧盟的数据保护政策对美国的商贸意味着什么?
  18. 《SQL数据分析——从基础破冰到面试题解》题解1
  19. android手机做音乐软件,安卓手机必备的五个黑科技APP,每个都强大到没有朋友!要低调使用...
  20. 通达信板块监控指标_[通达信主力监控精灵]通达信主力监控系统主图/副图指标公式...

热门文章

  1. 杭电1014 Uniform Generator
  2. html div 画半圆,css画变形的半圆
  3. vue router name命名规范_关于Vue项目微前端的实现
  4. IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session优缺点
  5. MyBatis分页插件PageHelper
  6. Hadoop、Storm和Spark 三者的区别、比较
  7. 会扫地炒菜,将来机器人当钟点工
  8. Linux硬盘分区与文件系统---学习笔记
  9. Selenium WebDriver控制操作(Python)
  10. Subversion 安装文件及操作手册