Welcome 微信登录

首页 / 操作系统 / Linux / Linux虚拟文件系统--open()

open()系统调用用来打开一个文件,本文就VFS层,对open系统调用的过程进行一个简单的分析。
  1. SYSCALL_DEFINE3(open, constchar __user *, filename, int, flags, int, mode)
  2. {
  3. long ret;
  4. if (force_o_largefile())
  5. flags |= O_LARGEFILE;
  6. ret = do_sys_open(AT_FDCWD, filename, flags, mode);
  7. /* avoid REGPARM breakage on x86: */
  8. asmlinkage_protect(3, ret, filename, flags, mode);
  9. return ret;
  10. }
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. {
  3. char *tmp = getname(filename);//拷贝文件名字符串到内核空间
  4. int fd = PTR_ERR(tmp);
  5. if (!IS_ERR(tmp)) {
  6. fd = get_unused_fd_flags(flags);//为文件分配一个文件描述符
  7. if (fd >= 0) {
  8. //实际的OPEN操作处理
  9. struct file *f = do_filp_open(dfd, tmp, flags, mode, 0);
  10. if (IS_ERR(f)) {
  11. put_unused_fd(fd);
  12. fd = PTR_ERR(f);
  13. } else {
  14. fsnotify_open(f->f_path.dentry);
  15. fd_install(fd, f);
  16. }
  17. }
  18. putname(tmp);
  19. }
  20. return fd;
  21. }
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]; 
};
  • 1
  • 2
  • 3
  • 4
  • 下一页
Zabbix中文不能显示问题Linux虚拟文件系统--文件路径名的解析(4)--符号链接相关资讯      Linux文件系统  Linux虚拟文件系统 
  • Linux文件系统简介及其系统管理工  (今 13:21)
  • 哪个文件系统最适合你的 Linux 系  (01月19日)
  • Linux文件系统管理  (12/15/2015 20:58:29)
  • Linux虚拟文件系统VFS  (04月04日)
  • Linux磁盘及文件系统概念  (12/22/2015 15:02:55)
  • Linux 文件系统(inode和block)  (12/02/2015 19:34:16)
本文评论 查看全部评论 (0)
表情: 姓名: 字数