Linux内核中确实存在专门用于文件操作的函数和接口,既包括面向设备驱动开发的file_operations结构体回调,也包括内核态直接读写文件的API。掌握这些内容对于驱动编写和内核模块开发非常关键。

一、file_operations结构体
在Linux字符设备驱动中,file_operations是最核心的数据结构,它包含了一系列函数指针,用户空间的open、read、write等系统调用最终会落到这些指针指向的函数上。
1. 主要成员
- open:打开设备时调用
- read:从设备读取数据
- write:向设备写入数据
- release:关闭设备时调用
- unlocked_ioctl:控制命令处理
2. 简单示例
下面是一个最简单的字符设备文件操作定义示例:
#include <linux/fs.h>
static int my_open(struct inode *inode, struct file *filp)
{
return 0; // 打开成功
}
static ssize_t my_read(struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
return 0; // 未读取数据
}
static int my_release(struct inode *inode, struct file *filp)
{
return 0;
}
static const struct file_operations my_fops = {
.owner = THIS_MODULE,
.open = my_open,
.read = my_read,
.release = my_release,
};
二、内核态文件操作函数
如果需要在内核模块中读写普通文件,可以使用filp_open、vfs_read、vfs_write和filp_close等函数,它们声明在linux/fs.h中。
1. 常用接口
| 函数 | 作用 |
|---|---|
| filp_open | 打开内核文件,返回struct file指针 |
| vfs_read | 从文件读取数据 |
| vfs_write | 向文件写入数据 |
| filp_close | 关闭已打开的文件 |
2. 内核读文件示例
#include <linux/fs.h>
#include <linux/uaccess.h>
struct file *fp;
mm_segment_t old_fs;
char buf[128];
loff_t pos = 0;
fp = filp_open("/tmp/test.txt", O_RDONLY, 0);
if (IS_ERR(fp)) {
return -1;
}
old_fs = get_fs();
set_fs(KERNEL_DS); // 允许内核空间访问用户接口
vfs_read(fp, buf, sizeof(buf), &pos);
set_fs(old_fs);
filp_close(fp, NULL);
三、注意事项
在内核中直接操作文件并不推荐用于常规驱动,因为可能引发阻塞和安全性问题。通常只在特殊模块如日志系统中谨慎使用。此外,在代码里提到的<linux/fs.h>头文件必须正确包含,否则无法使用上述函数。
总结:Linux不仅有内核文件操作函数,还提供了结构化的方式来对接用户空间调用,开发者应根据场景选择file_operations或filp系列接口。
Linux内核文件操作file_operations修改时间:2026-07-25 23:24:21