struct file_operations
是 Linux 内核中非常重要的一个结构体,它包含了一组回调函数指针,用于描述一个文件在内核中进行操作的各种方法。具体而言,struct file_operations
结构体定义了以下成员函数:
read()
:从设备读取数据。write()
:向设备写入数据。open()
:打开设备。release()
:释放设备。unlocked_ioctl()
:执行设备特定的 I/O 控制命令(需要使用无锁版本的 ioctl() 函数)。compat_ioctl()
:处理 32 位应用程序发送到 64 位内核驱动程序的 I/O 控制命令(需要在内核编译时启用 CONFIG_COMPAT)。mmap()
:将设备映射到用户空间地址空间以进行直接存储器访问(DMA)。flush()
:将缓冲区中的所有数据刷新到磁盘上。
除此之外,还有一些其他的成员函数可供使用,如:
llseek()
: 改变文件当前位置指针poll()
: 对文件进行多路复用fasync()
: 安装或卸载异步通知
同时,在使用这些函数时,通常还会利用相应的结构体成员来传递参数和返回值。例如:
static struct file_operations my_fops = {
.owner = THIS_MODULE,
.read = my_read,
.write = my_write,
.unlocked_ioctl = my_ioctl
};
static long my_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch (cmd) {
case MY_IOCTL_CMD1:
// 执行特定的命令1
break;
case MY_IOCTL_CMD2:
// 执行特定的命令2
break;
default:
return -EINVAL;
}
return 0;
}
static ssize_t my_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
// 读取设备数据并拷贝到用户空间缓冲区
return retval;
}
static ssize_t my_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
// 将用户空间缓冲区中的数据写入设备
return retval;
}
上述代码定义了一个名为 my_fops
的 file_operations
结构体,并设置了它的成员变量,其中 .read
指向 my_read()
函数、.write
指向 my_write()
函数、.unlocked_ioctl
指向 my_ioctl()
函数。这个结构体可以被传递给注册相关设备或节点时使用的 API,如 misc_register()
、cdev_add()
和 chrdev_add()
, 以便将相应的字符设备和驱动程序关联起来。
当用户空间进程对此设备进行 I/O 操作时,内核会调用该结构体中相应的函数来处理 I/O 请求。