通常对文件进行读写操作是在用户态完成的,但有时在内核态中也有对文件进行读写的需求,但内核中无法使用用户态的读写接口,比如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
这些函数使用的前提是系统的文件系统已挂载,文件系统不挂载,当然也就没办法对文件进行操作了。