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手段
 
 
posted @   lethe1203  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示