当用户在程序中使用了glibc库提供的文件操作函数open()、read()等访问文件时,这些函数会调用相应的系统调用来实际执行文件操作,并返回一个整数即文件句柄,文件句柄实际上是对应的 struct file
结构体的索引或指针,用于在内核中定位和操作打开的文件。
代码举例如下:
#include <stdio.h>
#include <fcntl.h> // 包含了文件控制操作的头文件
#include <unistd.h> // 包含了 POSIX 系统调用的头文件
int main() {
int fd; // 文件描述符,相当于文件句柄
// 使用系统调用 open() 打开文件,并指定文件名、打开模式和权限
// 返回的文件描述符(文件句柄)存储在变量 fd 中
fd = open("example.txt", O_RDONLY); // 以只读模式打开文件
// 检查文件是否成功打开
if (fd == -1) {
perror("open"); // 输出错误信息
return 1; // 返回错误码
}
// 成功打开文件后,可以进行其他操作,比如读取文件内容、写入文件等
// 关闭文件
close(fd);
return 0; // 程序正常结束
}
对于
APP 的每一个文件句柄,在内核里面都有一个“struct file
”与之对应。
打开一个字符设备节点时,内核中也有对应的struct file ,在struct file 中有结构体struct file_operations *f_op,这个结构体是由驱动程序提供的。
(注:
以前为了更容易理解驱动程序时,说“内核通过主设备号找到对应的 file_operations 结构体”,这并不准确。应该改成:“内核通过主、次设备号, 找到对应的 file_operations
结构体”)
结构体 struct file_operations 的定义如下:
总结: