seq_file操作函数
seq_file系列函数是为了方便内核导出信息到sysfs、debugfs、procfs实现的。
seq_file的相关接口函数如下:
int seq_open(struct file *file, const struct seq_operations *op); int seq_release(struct inode *inode, struct file *file); ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos); int seq_write(struct seq_file *seq, const void *data, size_t len); loff_t seq_lseek(struct file *file, loff_t offset, int whence);
用到seq_file的方便之处在于,对于UMD和KMD之间的交换,熟悉的copy_to_user和copy_from_user函数,但是在使用的时候需要自己分配一块buffer,seq_file系列操作函数就可以帮忙省去分配内核buffer的过程,举一个demo例子:
#include <linux/module.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> static int demo_seq_show(struct seq_file *m, void *v) { int i; for (i = 1; i <= 10; i++) { seq_printf(m, "%d\n", i); // 将数字序列写入到 seq_file 中 } return 0; } static int demo_seq_open(struct inode *inode, struct file *file) { return single_open(file, demo_seq_show, NULL); // 调用 single_open 函数 } static const struct file_operations demo_seq_fops = { .owner = THIS_MODULE, .open = demo_seq_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, }; static int __init demo_seq_init(void) { proc_create("demo_sequence", 0, NULL, &demo_seq_fops); // 创建名为 "demo_sequence" 的虚拟文件 return 0; } static void __exit demo_seq_exit(void) { remove_proc_entry("demo_sequence", NULL); // 移除虚拟文件 } module_init(demo_seq_init); module_exit(demo_seq_exit); MODULE_LICENSE("GPL");
应用测试demo:
#include <stdio.h> #include <stdlib.h> #define MAX_BUF_SIZE 1024 #define PROC_FILE_PATH "/proc/demo_sequence" int main() { FILE *file; char buffer[MAX_BUF_SIZE]; file = fopen(PROC_FILE_PATH, "r"); if (file == NULL) { perror("Error opening file"); return 1; } while (fgets(buffer, sizeof(buffer), file) != NULL) { printf("%s", buffer); } fclose(file); return 0; }
实际使用:
在驱动中,seq_file用于debug十分常见,例如需要获取控制器的配置寄存器,就可以procfs或者debugfs使用seq_file作为一种内核debug手段
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话