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 @ 2024-03-25 17:11  lethe1203  阅读(39)  评论(0编辑  收藏  举报