Linux虚拟文件系统--open()

字体大小: 中小 标准 ->行高大小: 标准

open()系统调用用来打开一个文件,本文就VFS层,对open系统调用的过程进行一个简单的分析。

  1. SYSCALL_DEFINE3(open, constchar __user *, filename, int, flags, int, mode) {
  2. long ret;
  3. if (force_o_largefile()) flags |= O_LARGEFILE;
  4. ret = do_sys_open(AT_FDCWD, filename, flags, mode);
  5. /* avoid REGPARM breakage on x86: */ asmlinkage_protect(3, ret, filename, flags, mode);
  6. return ret; }

force_o_largefile()用来判断系统是否为32位的,如果不是32位,也就是说为64位,则将O_LARGEFILE置位,主体工作由do_sys_open()来做

  1. long do_sys_open(int dfd, constchar __user *filename, int flags, int mode) {
  2. char *tmp = getname(filename);//拷贝文件名字符串到内核空间 int fd = PTR_ERR(tmp);
  3. if (!IS_ERR(tmp)) {
  4. fd = get_unused_fd_flags(flags);//为文件分配一个文件描述符 if (fd >= 0) {
  5. //实际的OPEN操作处理 struct file *f = do_filp_open(dfd, tmp, flags, mode, 0);
  6. if (IS_ERR(f)) { put_unused_fd(fd);
  7. fd = PTR_ERR(f); } else {
  8. fsnotify_open(f->f_path.dentry); fd_install(fd, f);
  9. } }
  10. putname(tmp); }
  11. return fd; }

open操作是特定于某个进程进行的,因此涉及到了VFS中特定于进程的结构,这里简单的介绍下

struct files_struct { 
  /*
  * read mostly part
  */ 
    atomic_t count; 
    struct fdtable *fdt; 
    struct fdtable fdtab; 
  /*
  * written part on a separate cache line in SMP
  */ 
    spinlock_t file_lock ____cacheline_aligned_in_smp; 
    int next_fd; 
    struct embedded_fd_set close_on_exec_init; 
    struct embedded_fd_set open_fds_init; 
    struct file * fd_array[NR_OPEN_DEFAULT]; 
};

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/64849.html