这段时间在做linux c嵌入式项目时遇到在linux内核读写文件的问题。众所周知,在内核态,不可以使用譬如用户态下的fopen等函数。这里介绍两种方法:
1.普通文件
例如tmp目录下demo文件,即tmp/demo
利用struct file* filp_open(const char* filename, int open_mode, int mode);
参数说明
filename: 表明要打开或创建文件的名称(包括路径部分)。在内核中打开的文件时需要注意打开的时机,很容易出现需要打开文件的驱动很早就加载并打开文件,但需要打开的文件所在设备还没有挂载到文件系统中,而导致打开失败。
open_mode: 文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。
mode: 创建文件时使用,设置创建文件的读写权限,其它情况可以匆略设为0。
static void read_file( void )
{
// 打开文件
struct file* fp = filp_open("/etc/redis/test.conf",O_RDWR,0);
if(!fp || IS_ERR(fp))
{
printk(KERN_ALERT "fail to open test.conf\n");
return -1;
}
filp_close( fp,NULL);
}
2.在proc目录下读写文件(推荐使用)
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
用户也可以在proc虚拟文件系统也创建节点,实现用户空间与内核空间的交互。
创建proc节点
struct proc_dir_entry *create_proc_entry (const char *name, mode_t mode, struct proc_dir_entry *parent);
参数:
name:/proc/下节点的文件名,也可以是路径;例:“driver/demo”,在driver下创建demo节点
mode:访问权限,与普通文件相同;例:0666可读可写,0444只读,0222只写
parent:父目录,可以为 NULL(表示 /proc 根目录);
例如:create_proc_entry("deviceInfo",0666,NULL); //在proc文件系统建立deviceInfo文件
文件操作
static int deviceInfo_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data) //将信息写入proc文件
static int deviceInfo_write_proc(struct file *file, const char *buffer,
unsigned long count, void *data)//从proc文件中获取信息
static void read_file( void )
{
struct proc_dir_entry *entry;
entry= create_proc_entry("deviceInfo",0666,NULL);
if(entry)
{
entry->read_proc = deviceInfo_read_proc;
entry->write_proc = deviceInfo_write_proc;
}
}
综上所述,采用proc文件更加安全以及快捷