//linux-5.10.x\fs\file.c
void fd_install(unsigned int fd, struct file *file)//将文件对象 file 安装到进程的文件描述符表中
{
__fd_install(current->files, fd, file);
/*current->files 是一个指向当前进程的文件描述符表的指针。
在操作系统中,每个进程都有一个与之关联的文件描述符表,用于跟踪进程打开的文件和文件描述符的状态。
current 表示当前正在执行的进程,而 current->files 则是获取该进程的文件描述符表的方式之一。
它是进程控制块(Process Control Block,PCB)中的一个成员变量。
通过 current->files,可以访问当前进程的文件描述符表,并对其中的文件对象进行操作,如打开、关闭、读取、写入等。
文件描述符表是一个数组或链表的形式,在操作系统内核中维护着每个文件描述符对应的文件对象信息。*/
}
EXPORT_SYMBOL(fd_install);
void __fd_install(struct files_struct *files, unsigned int fd,
struct file *file)
{
struct fdtable *fdt;
rcu_read_lock_sched();
if (unlikely(files->resize_in_progress)) { // 如果文件描述符表正在调整大小
rcu_read_unlock_sched(); // 释放RCU读取锁
spin_lock(&files->file_lock); // 获取文件锁,用于保护文件描述符表的修改
fdt = files_fdtable(files); // 获取文件描述符表结构体指针
BUG_ON(fdt->fd[fd] != NULL); // 检查是否存在文件描述符已被占用的BUG
rcu_assign_pointer(fdt->fd[fd], file); // 针对给定的文件描述符设置对应的文件指针
spin_unlock(&files->file_lock); // 释放文件锁
return;
}
/* coupled with smp_wmb() in expand_fdtable() */
smp_rmb(); // 内存屏障,确保在此之前的读操作完成后再进行后续的读操作
fdt = rcu_dereference_sched(files->fdt); // 通过RCU机制获取文件描述符表结构体指针
BUG_ON(fdt->fd[fd] != NULL); // 检查是否存在文件描述符已被占用的BUG
rcu_assign_pointer(fdt->fd[fd], file); // 针对给定的文件描述符设置对应的文件指针
rcu_read_unlock_sched(); // 释放RCU读取锁
}
09-11
2590
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交