总结自linux下的seq_file.txt的document。
虚拟文件系统如procfs,debugfs等在建立虚拟文件的时候,都要设计到虚拟文件的操作。
使用虚拟文件的时候比较挑战的一点在于,当虚拟文件相当大的时候,操作虚拟文件需要一些技巧,在多次读写的时候要小心的操作文件的position,当虚拟文件的使用越来越广泛的时候,这样的操作代码也越来越多,因此在2.6内核中加入了一组函数来方便实现虚拟文件的操作,这就是seq_file。
1. seq_file
seq_file声明在
1.1 seq_file的iterator接口
希望使用seq_file接口的模块都必须要要实现iterator对象来遍历虚拟文件的数据。
iterator接口包含4个函数需要实现用于遍历:
struct seq_operations {
void * (*start) (struct seq_file *m, loff_t *pos);
void (*stop) (struct seq_file *m, void *v);
void * (*next) (struct seq_file *m, void *v, loff_t *pos);
int (*show) (struct seq_file *m, void *v);
};
1.1.1 start接口
start接口接受一个pos作为起始位置,并且返回一个iterator指针。对于一个顺序访问的虚拟文件来说,最简单的start函数可能如下:
static void *ct_seq_start(struct seq_file *s, loff_t *pos)
{
loff_t *spos = kmalloc(sizeof(loff_t), GFP_KERNEL);