linux内核文件读写操作

因为最近需要在内核中读写文件,然后自己再打开文件看其中的内容(vi)。,这个不同于fread,fwrite那种上层的文件读写操作,故网上搜集大家的知识帖,汇总了一份适合自己的文件读写函数,在此晒出:

首先需要

#include <linux/fs.h>
#include <linux/uaccess.h>
这两个文件在linux下的include中都有,可以直接拿来用


函数主体:

char buff[10] = {'0', ',', '0', ',', '0', ';', '0', ',', '0', '\n',};



static int file_write()
{

	mm_segment_t fs;
	struct file *fp = NULL;

	fp = filp_open("/dev/wanghao", O_RDWR | O_APPEND| O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
	
	if (IS_ERR(fp))
	{
		return -1;
	}
	
	fs = get_fs();
	set_fs(KERNEL_DS);
	
	//fp->f_op->write(fp,buff,sizeof(buff),&fp->f_pos);
	fp->f_op->write(fp,buff,10,&fp->f_pos);
	
	printk("write done\n");
	filp_close(fp,NULL);
	set_fs(fs);
	return 0;
}

解释如下:

1.

(1)strcut file*filp_open(const char* filename, int open_mode, int mode); 

该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。

(2) filename: 表明要打开或创建文件的名称(包括路径部分)。

(3)open_mode: 文件的打开方式,其取值与标准库中的open相应参数类似,可以取

O_CREAT(若无文件则创建,若有则不操作),

O_RDWR(读写权),

O_RDONLY(只读),

O_APPEND(每次从文件末尾开始,该设置很重要,加上这个方式才可以每次从文件末尾开始写,不会覆盖之前写过的东西)等。

(4)mode: 创建文件时使用,设置创建文件的读写权限,其它情况可以匆略设为0

S_IRWXU<00700>;:文件拥有者有读写执行权限

S_IRUSR (S_IREAD)<00400>;:文件拥有者仅有读权限

S_IWUSR (S_IWRITE)<00200>;:文件拥有者仅有写权限

S_IXUSR (S_IEXEC)<00100>;:文件拥有者仅有执行权限

S_IRWXG<00070>;:组用户有读写执行权限

S_IRGRP<00040>;:组用户仅有读权限

S_IWGRP<00020>;:组用户仅有写权限

S_IXGRP<00010>;:组用户仅有执行权限

S_IRWXO<00007>;:其他用户有读写执行权限

S_IROTH<00004>;:其他用户仅有读权限

S_IWOTH<00002>;:其他用户仅有写权限

S_IXOTH<00001>;:其他用户仅有执行权限

2.

对于get_fs() 和set_fs()函数的作用,摘录网上其他人的总结,如下:

系统调用本来是提供给用户空间的程序访问的,所以,对传递给它的参数(比如上面的buf),它默认会认为来自用户空间,在->write()函数中, 为了保护内核空间,一般会用get_fs()得到的值来和USER_DS进行比较,从而防止用户空间程序“蓄意”破坏内核空间;

而现在要在内核空间使用系统调用,此时传递给->write()的参数地址就是内核空间的地址了,在USER_DS之上(USER_DS ~ KERNEL_DS),如果不做任何其它处理,在write()函数中,会认为该地址超过了USER_DS范围,所以会认为是用户空间的“蓄意破坏”,从而不允许进一步的执行; 为了解决这个问题; set_fs(KERNEL_DS);将其能访问的空间限制扩大到KERNEL_DS,这样就可以在内核顺利使用系统调用了!

3.读写文件

kernel中文件的读写操作可以使用vfs_read()和vfs_write,在使用这两个函数前需要说明一下get_fs()和 set_fs()这两个函数。

vfs_read() vfs_write()两函数的原形如下:

ssize_t vfs_read(struct file* filp, char__user* buffer, size_t len, loff_t* pos);

ssize_t vfs_write(struct file* filp, constchar __user* buffer, size_t len, loff_t* pos);

4.

其中因为我的buff是固定的10,所以我直接在write()中写死了大小为10,在main函数中:

			buff[0] = wanghao_send_num + '0';
			buff[2] = sent_2s_wanghao + '0';
			buff[4] = wanghao_recv_num + '0';
			buff[6] = rect_rate + '0';
			buff[8] = bitrate_wanghao + '0';

			file_write();
本来以为直接传入int型也可以写入文件中,不知为何没写进去,故只能采取上述方法将int数写入char型的buff中了。


最后查看文件操作:

cd ..

cd dev/

vi wanghao

即可

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值