linux内核中读写文件

来源:互联网 发布:淘宝客源码卷皮 编辑:程序博客网 时间:2024/05/16 15:26

内核中可以使用sys_open系统调用来打开文件,也可以直接使用filp_open函数,前者返回一个文件句柄,后者返回一个struct file*型的指针。不过刚开始不清楚,使用:
fd = sys_open(path, O_RDONLY, 0);
打开文件却不能成功。而:
filp = filp_open(path, O_RDONLY, 0);
却能成功。
但使用filp->f_op->read(filp, buf, size, &filp->f_pos);
读文件却不能将内容读到buf中去。

后面分析sys_open的原型为:
asmlinkage long sys_open(const char __user * filename, int flags, int mode);
在filename前面有个__user的修饰符,这里似乎说明了这个filename是来自用户空间,进而查看struct file中f_op对应用类型struct file_operation结构体对read指向的函数原型的定义中,buf参数也是用__user修饰的,也就是说,它只能向用户空间传递。

有人使用set_fs(get_ds())来设置进程寻址界限,使其可以对内核空间进行寻址,从而可以读写内核缓冲区。

1.读文件:

struct file *fp;

mm_segment_t fs;

loff_tpos;

 

fp = filp_open("/data/xx.conf"O_RDWR | O_CREAT0644);

 if (IS_ERR(fp)) { printk("create file error\n"); return -1;}

 fs = get_fs();

 set_fs(KERNEL_DS);

pos = 0;

vfs_write(fpbufsizeof(buf), &pos);

 filp_close(fpNULL);

 set_fs(fs);

 

2.读文件:

struct file *fp;

mm_segment_t fs;

loff_t pos;

 

fp = filp_open("/data/xx.conf",O_RDWR,0644);

if (IS_ERR(fp)){printk("read file error\n");return -1;}

fs =get_fs();

set_fs(KERNEL_DS);

pos =0;

 vfs_read(fpbuf1sizeof(buf), &pos);

filp_close(fp,NULL);

set_fs(fs);

原创粉丝点击