Linux seq_printf输出内容不完整的问题
写在前面的话:这是多年前在项目中遇到的问题,作为博客的开篇之作,有不足之处,请各位大侠斧正!谢谢!
seq_file接口介绍
有许多种方法能够实现设备驱动(或其它内核组件)提供信息给用户或系统管理员。一个有用的技术是在debugfs,/proc或其他地方创建虚拟文件。虚拟文件能够提供容易获取的人类可读的输出,而且并不需要任何特殊的工具软件,他们能够减轻脚本作者的工作。
seq_file接口就是其中一个能够为内核模块提供信息给用户或管理员的接口,它通过在/proc目录下创建虚拟文件,提供相关内核模块的用户接口。
struct seq_operations 结构体
struct seq_operations提供了seq_file文件的迭代操作接口。其中:
start用于起始访问时文件的初始化工作,并返回一个链接(迭代)对象,或者SEQ_START_TOKEN(表示所有循环的开始);
stop用于文件访问结束时的清理工作,这里文件访问结束表示所有链接对象遍历完毕;
next用于在遍历中寻找下一个链接对象;
show用于对遍历对象的操作,主要调用seq_printf和seq_puts等函数,打印这个对象节点的信息。
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);
};
内核模块struct seq_operations结构体定义
在自研内核模块中,skb_status_seq_ops实现当前skb使用状态的打印,其定义如下:
static const struct seq_operations skb_status_seq_ops = {
.start = xxxdriver_seq_start,
.next = xxxdriver_seq_next,
.stop = xxxdriver_seq_stop,
.show = skb_status_seq_show,
};
xxxdriver_seq_start:开始遍历xxxdriver_dev_list的初始化工作;
xxxdriver_seq_next:遍历xxxdriver_dev_list时返回一个xxxdriver链接对象;
xxxdriver_seq_stop:遍历xxxdriver_dev_list完成时,做清理工作;
skb_status_seq_show:输出遍历对象的一些信息。
在skb_status_seq_show函数中,通过seq_printf函数实现信息的打印,其实现如下:
static int skb_status_seq_show(struct seq_file *seq, void *v)
{
if (v =