zoukankan      html  css  js  c++  java
  • Linux-2.6 open()打开文件涉及的内核处理和数据结构分析

    Linux-2.6 文件打开过程涉及数据结构分析:

    原文链接 : http://blog.csdn.net/ordeder/article/details/24420637

    用户层面

    文件打开的结构为:

    fd = open(path,flag,mode)


    内核层面

    open函数内陷到内核空间后,做了下面操作:


    1. 找一个空暇的fd

    进程打开一个文件,须要消耗该进程的一个文件描写叙述符fd,该fd是用来唯一标示打开的文件,也成为文件号。通过函数get_unused_fd_flags从依据fdtable返回一个空暇的fd。fd相应的task_struct->files[fd]空暇的。假设进程当前使用的fd个数超过了进程能够打开最大文件数的限制,则内核将返回错误。回到用户空间。否则进入第2步骤。


    2. path walk

    系统依据path,遍历路径。linux中一切皆文件,包含文件夹相同被视为文件。

    每一个文件都有一个入口结构来标示dentry{},假设dentry记录的为文件夹文件,那么dentry->d_inode描写叙述的是当前文件夹下的子文件夹的存储信息。反之。假设dentry记录的为文件,那么dentry->d_inode记录了文件相关的存储信息。linux中有个path_walk,会依据參数path中的字段和dentry->d_name进行文件夹的查找和遍历,path->dentry->d_inode找子文件夹信息,循环遍历,直到找到目标文件的dentry。目标文件的inode即为dentry->d_inode所指向的节点。

    3. 构建打开文件的描写叙述结构 file{}

       当找到目标文件的i节点后。对新建的file结构进行初始化,如图蓝色箭头所看到的,
       file->f_path = *path;
         file->f_inode = path->dentry->d_inode;
         file->f_mapping = path->dentry->d_inode->i_mapping;
         file->f_mode = mode;
         file->f_op = fop;
         ...

    4. 构建fd和file的关系

       将file地址记录于task_struct->files->fd_array[fd] = &file
     

    总结

       进程打开一个文件后,内核为其构建了file{}结构。用于描写叙述文件的读写mode、flag、当前读写位置f_pos以及文件操作的接口f_op等。

    而进程是通过task_struct->files->fd_array[]纪录全部打开的文件。每一个打开的文件通过数组的下标进行唯一标示,这个下标即为我们open函数的返回值fd(int类型)

  • 相关阅读:
    dubbo入门(一)
    java中文件操作《一》
    Unity 游戏框架搭建 2019 (七) 自定义快捷键
    凉鞋:我所理解的框架 【Unity 游戏框架搭建】
    Unity 游戏框架搭建 2019 (六) MenuItem 复用
    Unity 游戏框架搭建 2019 (五) 打开所在文件夹
    Unity 游戏框架搭建 2019 (四) 导出 UnityPackage
    Unity 游戏框架搭建 2019 (三) 生成文件名到剪切板
    Unity 游戏框架搭建 2019 (二) 文本复制到剪切板
    Unity 游戏框架搭建 2019 (一) 简介与第一个示例文件名的生成
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6883163.html
Copyright © 2011-2022 走看看