前边说过目录项创建时一般都使用默认的读写函数,本节就来看看默认的文件操作函数的定义。前边已经引用过该定义,此处再次引用:
static const struct file_operations proc_file_operations = {
.llseek = proc_file_lseek,
.read = proc_file_read,
.write = proc_file_write,
};
proc_file_read的实现
从proc文件中读取数据需要经历三个步骤
1.申请内存页用于存储数据
2.调用文件相关的函数填充步骤1申请的内存页
3.把数据从内核空间拷贝到用户空间
很明显,步骤2至关重要,因为这一步正是准备数据。在二.proc数据结构一节我们已经注意到struct proc_dir_entry中提供了两个用于读取数据的函数指针,get_info和read_proc,在proc_file_read中就需要根据不同情况选取二者其一。闲言少叙,上代码说话。一如既往,代码是经过简化的。
static ssize_t proc_file_read(struct file *file, char __user *buf,
size_t nbytes, loff_t *ppos)
{
struct inode * inode = file->f_path.dentry->d_inode;
char *page;