proc作为输入
关于proc的一些基本概念和基本使用以及一些核心数据结构可以参考我的上一篇文章
在上一篇文章中提到了利用proc作为内核空间传递数据给用户空间的一种方式,那么proc能否作为用户空间传递数据给内核空间的一种手法呢?答案当然是可以的,熟悉linux的读者应该都知道我们不光光可以读取proc文件中的内容还是可以向proc文件中写入要传递的数据的,那么如何通过proc来向内核输入信息呢,通过查看proc_dir_entry发现,在这个proc核心数据结构中不仅仅有一个read_proc的函数指针,而且还有一个write_proc函数指针。恭喜你猜对了,通过这个钩子函数的确就可以实现利用proc向内核空间传递数据,但是随着内核的发展,内核的开发者采用了另外一种方式来提供proc的读写钩子函数。在2,6内核中两种方式都是可以的,后来笔者发现在我使用的3.10内核上居然已经没有第一种了。
2.6系列的内核提供了两种方法来操作proc
一种就是:
read_proc_t *read_proc;
write_proc_t *write_proc;
第二种就是:
struct inode_operations * proc_iops;
const struct file_operations * proc_fops;
可以参考linux内核文件系统相关的知识
可是到了3.10系列内核后就只有第二种了,所以为了兼容不同内核版本,在操作proc的时候最好按照标准的VFS的接口形式来操作VFS两种不同版本内核对proc_dir_entry的定义
下面是在2.6内核以及3.10内核中关于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;
loff_t size;
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;