• linux驱动中读写文件操作


    通常对文件进行读写操作是在用户态完成的,但有时在内核态中也有对文件进行读写的需求,但内核中无法使用用户态的读写接口,比如fopen等。linux在内核中也提供了对文件进行操作的接口函数。如下几个函数:

    1,打开文件

    struct file *filp_open(const char *, int, umode_t);

    2,关闭文件

    int filp_close(struct file *, fl_owner_t id);

    3,读文件

    ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);

    4,写文件

    ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);

    比如我在驱动中读写文件数据的代码:

    读文件:

    static int test_file_read(const char * file_path,char *buff, int size)
    {
        struct file *file = NULL; //保存打开文件的文件指针变量
        mm_segment_t old_fs; //保存内存边界的变量
        loff_t pos;
        int ret=0;
        
        file = filp_open(file_path,O_RDWR,0664);//打开文件
        
        if(IS_ERR(file))
        {
          printk("\nfile_read: filp_open fail!\n");
          return -1;
        }
          
        old_fs = get_fs();
        set_fs(KERNEL_DS);
        
        pos = 0;
        
        ret=vfs_read(file, buff, size, &pos); //读操作
        printk("\nvfs_read return ret=%d\n",ret);
        
        filp_close(file, NULL); //关闭文件
        
        set_fs(old_fs);//边界恢复
        
        return 0;
    }

    写文件:

    static int save_data_to_file(const char* save_file_name, char *buff, int size)    //保存数据至文件
    {
        struct file *fp = NULL;
        mm_segment_t fs;
        loff_t pos;
        int ret=0;
        
        printk("save_file_name = %s!\n",save_file_name);
        fp = filp_open(save_file_name, O_RDWR | O_CREAT, 0644);
        if (IS_ERR(fp))
         {
             printk("\nsave_data_to_file create file error\n");
             return -1;
         }
        
        fs =get_fs();
        set_fs(KERNEL_DS);
        pos =0;
        ret=vfs_write(fp, buff, size, &pos);
        printk("\nvfs_write return ret=%d\n",ret);
     
        filp_close(fp,NULL);
        set_fs(fs);
        return 0;
    }

    需包含头文件

    #include
    #include

    这些函数使用的前提是系统的文件系统已挂载,文件系统不挂载,当然也就没办法对文件进行操作了。

  • 相关阅读:
    面向对象三大特征之多态
    不相交集类 (并查集)
    JAVA常见基础面试问题汇集
    JS上传文件(base64字符串和二进制文件流)
    Python 实现动态解析阿里云DNS记录
    如何有效的禁止Google Chrome自动更新?
    最全的推特群推营销秘籍
    [数据结构]栈和队列
    解决 urllib2 中 CookiesMiddleware 的 cookie 问题
    Docker+jenkinsPipeline运行实现python自动化测试(超详细)
  • 原文地址:https://blog.csdn.net/u011774634/article/details/127772788