在proc 目录下创建文件,不得不提到的struct file_operations , 详细struct 信息,可以查阅—— [linux kernel] .
本篇主要讨论的是以下几个接口:
open
int (open) (struct inode , struct file *); //打开
实现test_proc_show function,这样可以在shell 下输入cat /proc/test返回help 信息、或者显示你希望提供的信息。
test_proc_show 函数:
static int test_proc_show(struct seq_file *m, void *v);
write
read/write 功能类似,write 相对较为复杂,这里主要介绍下write。
static ssize_t test_proc_write(stuct file *file, const char *buf, size_t count, loff_t *f_ops);
write 使用有两种方法:
- shell 下输入echo X X > /proc/test
- 使用linux 提供的write接口。
第一个方法比较简单,就不说了。主要说下第二个例子:
/* open file */
char * file = "/proc/test";
int fd = 0;
fd = open(file, O_RDWR);
if (fd == -1) {
prerror("open fail\n");
return NULL;
}
关于test_proc_write的功能编写,与正常的function没有区别,主要注意返回值:
- 如果正常执行,请返回count;如果无法用sscanf拿到预期的值,请再使用sscanf拿一次字符串,如果返回值非0,请返回count;如果返回值为0,请返回异常值。关于sscanf 请参考—— [Linux学习笔记之sscanf] .
- 如果异常执行,请返回异常值。
创建proc下文件
说了这么多,可能还不知道如何在proc 下创建一个file 呢?其实比较简单, 核心的function就是:
static inline struct proc_dir_entry *proc_create(
const char *name, umode_t mode, struct proc_dir_entry *parent,
const struct file_operations *proc_fops);
示例:
如果返回非空,则表示file 创建成功,当然在创建的时候需要制定文件名(name), 操作权限(mode),parent可以填NULL,proc_fops就是上文提到的file_operations.
proc_create 一般是放在init函数里面,init 函数在linux kernel 里面有两种方法:
- 提供一个init 函数,由相关module init 的时候调用;
- 提供module init / module exit 函数入口,由kernel 加载或者手动inmod
moudle_init(void )/module_exit(void )