文件的打开由sys_open函数实现,主要作用是建立进程与文件的联系。sys_open()根据文件名路径字符串搜索对应文件的dentry和inode结构,并且初始化VFS的file对象,同时把file对象的指针保存在进程的files_struct结构的一个数组中,数组的下标就是文件的描述符fd,这样应用程序的fd就对应内核中的一个file对象。
打开
fs/open.c
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
if (force_o_largefile())
flags |= O_LARGEFILE;
return do_sys_open(AT_FDCWD, filename, flags, mode);
}
AT_FDCWD表示以进程当前目录作为起始目录来搜索filename文件,
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
struct open_flags op;
int lookup = build_open_flags(flags, mode, &op);
struct filename *tmp = getname(filename);
int fd = PTR_ERR(tmp);
if (!IS_ERR(tmp)) {
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
struct file *f = do_filp_open(dfd, tmp, &op, lookup);
if (IS_ERR(f)) {
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
fsnotify_open(f);
fd_install(fd, f);
}
}
putname(tmp);
}
return fd;
}