1 / 20
文档名称:

Linux内核源码阅读之打开文件篇(转).doc

格式:doc   大小:17KB   页数:20页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Linux内核源码阅读之打开文件篇(转).doc

上传人:学习好资料 2021/8/2 文件大小:17 KB

下载得到文件列表

Linux内核源码阅读之打开文件篇(转).doc

文档介绍

文档介绍:Linux内核源码阅读之打开文件篇(转)
Linux中打开文件是通过open系统调用实现,其函数中调用了do_sys_open()函数完成打开功能,所以下面主要分析do_sys_open()函数,首先先看下open系统调用的入口函数,再具体看do_sys_open()函数:
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
{
long ret;

if (force_o_largefile())
flags |= O_LARGEFILE;

ret = do_sys_open(AT_FDCWD, filename, flags, mode);
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(3, ret, filename, flags, mode);
return ret;
}


long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
{
/*获取文件名称,由getname()函数完成,其内部首先创建存取文件名称的空间,然后*从用户空间把文件名拷贝过来*/
char *tmp = getname(filename);
int fd = PTR_ERR(tmp);

if (!IS_ERR(tmp)) {
/*获取一个可用的fd,此函数调用alloc_fd()函数从fd_table中获取一个可用fd,并做些简单初始化,此函数内部实现比较简单,此次分析不细看*/
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
/*fd获取成功则开始打开文件,此函数是主要完成打开功能的函数,在此先放一放,下面详细分析*/
struct file *f = do_filp_open(dfd, tmp, flags, mode, 0);
if (IS_ERR(f)) {
/*打开失败,释放fd*/
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
/*文件如果已经被打开了,调用fsnotify_open()函数*/
fsnotify_open(f->);
/*将文件指针安装在fd数组中*/
fd_install(fd, f);
}
}
/*释放放置从用户空间拷贝过来的文件名的存储空间*/
putname(tmp);
}
return fd;
}

接下来即将进入到打开功能的真正实现功能的函数do_filp_open()函数:
struct file *do_filp_open(int dfd, const char *pathname,
int open_flag, int mode, int acc_mode)
{
/*
*…若干变量声明
*/
/*改变参数fl