seq_file应用

seq_file接口,在kernel 2.6中将代替老的proc接口

seq_file接口的实现,引入了对象、迭代子等概念,这类似于C++中的泛型技术

如果对泛型技术有一定的了解,则会对seq_file接口的理解有一定的帮助

下面是原文的实例代码,略作注释:

/*
* Simple demonstration of the seq_file interface.
*
* $Id: seq.c,v 1.1 2003/02/10 21:02:02 corbet Exp $
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
MODULE_AUTHOR("Jonathan Corbet");
MODULE_LICENSE("Dual BSD/GPL");
/* 使用seq_file接口,需要实现4个函数:start()、next()、stop()、show(),这4个函数用于对设备的输出信息的迭代访问(控制)*/
/*
* The sequence iterator functions. We simply use the count of the
* next line as our internal position.
*/
/*start()函数,用于设置访问设备的起始位置;本示例的设备位置的含义与proc文件的偏移量相同;返回值作为迭代子*/
static void *ct_seq_start(struct seq_file *s, loff_t *pos)
{
loff_t *spos = kmalloc(sizeof(loff_t), GFP_KERNEL);
if (! spos)
 return NULL;
*spos = *pos;
return spos;
}
/*next()函数,用于实现迭代子的访问步长,本示例的步长是偏移量递加,每次加1;返回值是新的迭代子*/
static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
{
loff_t *spos = (loff_t *) v;
*pos = ++(*spos);
return spos;
}
/*stop()函数,完成一些清理函数*/
static void ct_seq_stop(struct seq_file *s, void *v)
{
kfree (v);
}
/*
* The show function.
*/
/*show()函数,用于向proc文件输出设备需要输出的信息;本示例中仅输出迭代子的序列号*/
static int ct_seq_show(struct seq_file *s, void *v)
{
loff_t *spos = (loff_t *) v;
seq_printf(s, "%Ld\n", *spos);
return 0;
}
/*
* Tie them all together into a set of seq_operations.
*/
/*seq_file接口的函数操作集*/
static struct seq_operations ct_seq_ops = {
.start = ct_seq_start,
.next = ct_seq_next,
.stop = ct_seq_stop,
.show = ct_seq_show
};
/*
* Time to set up the file operations for our /proc file. In this case,
* all we need is an open function which sets up the sequence ops.
*/
/*proc接口的open方法实现,open()函数将proc文件与seq_file接口的函数操作集关联起来*/
static int ct_open(struct inode *inode, struct file *file)
{
return seq_open(file, &ct_seq_ops);
};
/*
* The file operations structure contains our open function along with
* set of the canned seq_ ops.
*/
/*proc接口的函数操作集,除open方法外,其他方法不需要实现,已经由seq_file的内部代码实现完毕*/
static struct file_operations ct_file_ops = {
.owner = THIS_MODULE,
.open = ct_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release
};
/*
* Module setup and teardown.
*/
/*模块初始化,创建proc文件*/
static int ct_init(void)
{
struct proc_dir_entry *entry;
entry = create_proc_entry("sequence", 0, NULL);
if (entry)
 entry->proc_fops = &ct_file_ops;
return 0;
}
/*模块注销,删除所创建的proc文件*/
static void ct_exit(void)
{
remove_proc_entry("sequence", NULL);
}
module_init(ct_init);
module_exit(ct_exit);

时间: 2024-09-10 14:46:29

seq_file应用的相关文章

linux 内核与用户空间通信之netlink使用方法

Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制.同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared M

linux文件系统(二)——VFS四个主要对象的实现

声明:本Linux文件系统博客,共分四节,是根据网上多个相关博客,以及自己的理解加上相关资料总结而成.(作者:lvyilong316) VFS采用的是面向对象的设计思想,使用一簇数据结构来代表通用文件对象.所有内核中的数据结构都使用C结构体实现. 1.superblock(超级块)对象 保存一个挂在的文件系统的相关信息(Stores information concerning a mounted filesystem. For disk-based filesystems, this obje

linux RTC 驱动模型分析

最近学习RTC(real time clock)实时时钟,RTC实时时钟主要作用是给Linux系统提供时间.RTC因为是电池供电的,所以掉电后时间不丢失.Linux内核把RTC用作"离线"的时间 与日期维护器.当Linux内核启动时,它从RTC中读取时间与日期,作为基准值.在运行期间内核完全抛开RTC,以软件的形式维护系统的当前时间与日 期,并在需要时将时间回写RTC芯片.另外如果RTC提供了IRQ中断并且可以定时,那么RTC还可以作为内核睡眠时唤醒内核的闹钟.应用程序可以用 RTC提

The Linux Kernel Module Programming Guide

The Linux Kernel Module Programming Guide Peter Jay SalzmanMichael BurianOri Pomerantz Copyright 2001 Peter Jay Salzman The Linux Kernel Module Programming Guide is a free book; you may reproduce and/or modify it under the terms of the Open Software

linux下如何写RTC驱动

============================================ 作者:yuanlulu http://blog.csdn.net/yuanlulu 版权没有,但是转载请保留此段声明 ============================================ /drivers/rtc/rtc-test.c下有一个rtc驱动的框架例程. 填写 rtc_class_ops 编写RTC内核驱动的主要步骤就是填写 rtc_class_ops. 这个结构体中使用的st

重要的 CentOS 7 Linux 内核安全更新修复了五个漏洞

CentOS 是基于 Red Hat Enterprise Linux 的操作系统,所以它也继承了其安全更新,最近的更新是对 Red Hat Enterprise Linux 7 内核软件包发现的五个漏洞打而进行的修补,这些漏洞也会影响到 CentOS 7 用户. 根据红帽上游的重要安全公告,已更新的内核软件包是针对在 Linux 内核的 packet_set_ring() 函数中发现的缓冲区溢出(CVE-2017-7308)进行的修补,该漏洞会导致本地攻击者使用 CAP_NET_RAW 访问进

如何防止远程程序与RDS PG连接中断

背景 偶尔有用户会遇到远程程序连接RDS PG,在不做任何操作一段时间后可能中断. 其实可能是用户和RDS PG之间,某些网络设备设置了会话空闲超时,会主动中断会话. 那么有什么方法能解决这个问题呢? 运维的同学可能有这方面的经验,例如使用securecrt或者其他终端连接服务器时,可以设置这些管理工具的no-op,周期性的发一些空字符过去,保证会话上有流量. 但是数据库连接怎么搞呢? PostgreSQL提供了tcp keep alive的参数可供用户设置. 例子 为了避免会话中断的问题, 可

Linux 内核自防护项目 KSPP

内核自防护 内核自防护是针对 Linux 内核对抗自身的安全缺陷的设计与实现.这个领域涉足广泛的问题,包括干掉一整个类型的 bug,阻止漏洞利用的方法和积极的检测攻击行为.这篇文档不讨论所有的议题,但这篇文档是整个内核自防护项目的一个起点和回答一些常见的问题.(欢迎提交补丁) 在最糟糕的场景下,我们假设一名没有权限的本地攻击者拥有对内核内存任意读写访问的能力.在很多情况下,被利用的 bug 不会提供这个层面的访问能力,但在防御最糟糕的情况的同时我们也会讨论更多限制的攻击场景.root 用户大大的

如何通过阅读源代码了解 vmstat 中的指标

如何通过阅读源代码了解 vmstat 中的指标 vmstat -a 命令能看到 active memory 和 inactive memory,但是它们是什么意思呢? $ vmstat -a procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 1 0 138096 31