zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    暑期学习录
    08管道命名符
    07输入输出重定向
    06grep与find命令详解
    05tar命令详解
    04文件目录管理命令
    03工作目录切换命令与文本文件编辑命令
    02系统状态检测命令
    01常用系统工作命令
    vue2.0细节剖析
  • 原文地址:https://www.cnblogs.com/welhzh/p/4583994.html
Copyright © 2011-2022 走看看