• linux 内核驱动加载过程中 向文件系统中的文件进行读写操作


    utils.h 文件:

    #ifndef __UTILS_H__
    #define __UTILS_H__
    
    void a2f(const char *s, ...);
    
    #endif

    utils.c 文件:

    #include <linux/fs.h>
    #include <asm/segment.h>
    #include <asm/uaccess.h>
    #include <linux/buffer_head.h>
    #include <linux/string.h>
    
    #include "utils.h"
    
    #define FILE_PATH "/hzh"
    
    static struct file *fp;
    
    static int open_it() {
        if (fp) return 0;
        mm_segment_t oldfs;
        int err = 0;
    
        oldfs = get_fs();
        set_fs(get_ds());
        fp = filp_open(FILE_PATH, O_CREAT|O_RDWR|O_APPEND, 0); // 以追加方式写入文件
        set_fs(oldfs);
        if (IS_ERR(fp)) {
            err = PTR_ERR(fp);
            return 1;
        }
    
        return 0;
    }
    
    static void close_it() {
        if (!fp) return;
        filp_close(fp, 0);
        fp = 0;
    }
    
    static int read_it(unsigned long long offset, unsigned char *data, unsigned int size) {
        if (!fp) return 0;
        mm_segment_t oldfs;
        int ret;
    
        oldfs = get_fs();
        set_fs(get_ds());
    
        ret = vfs_read(fp, data, size, &offset);
    
        set_fs(oldfs);
        return ret;
    }
    
    static int write_it(unsigned long long offset, unsigned char *data, unsigned int size) {
        if (!fp) return 0;
        mm_segment_t oldfs;
        int ret;
    
        oldfs = get_fs();
        set_fs(get_ds());
    
        ret = vfs_write(fp, data, size, &offset);
    
        set_fs(oldfs);
        return ret;
    }
    
    static int sync_it() {
        if (!fp) return 0;
        vfs_fsync(fp, 0);
        return 0;
    }
    
    void a2f(const char *fmt, ...) {
        if (open_it()) return;
    
        char print_buf[1024];
        va_list args;
        int printed;
        //初始化args,使其指向可变参数的第一个参数,fmt是可变参数的前一个参数
        va_start(args, fmt); 
        printed = vsprintf(print_buf, fmt, args);
        va_end(args);
    
        write_it(0, print_buf, printed);
        sync_it();
    
        // close_it();
    }
  • 相关阅读:
    正则表达式验证日期(多种日期格式)——转载
    NPOI导出Excel——精简版
    Ubuntu下安装部署.NET Core多版本环境
    搭建 nuget 私用库 BaGet
    ubuntu 监听端口
    搭建npm 私用库 verdaccio
    pgsql 性能测试 pgbench
    docker-compose 创建网络
    安装 docker-compose 启动
    dotnet sdk安装以及环境变量设置 Ubuntu 18.04 LTS
  • 原文地址:https://www.cnblogs.com/welhzh/p/4583994.html
Copyright © 2020-2023  润新知