当前位置: 首页 > news >正文

文件描述符、文件表项、V节点表项、dup

文件描述符(进程级别):

       1)、在每个进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视察为一个矢量(数组),每个描述符占用一项。与每个文件描述符相关联的是:

       (a)、文件描述符标志。

       (b)、指向一个文件表项的指针。(不同的文件描述符可以指向同一个文件表项,例如用dup函数复制文件描述符,得到一个新的文件描述符,但是它们指向同一个文件表项,因此它们也指向同一个V节点表。)


    文件表项(全局级别,所有进程共享?推断的)

        2)、内核为所有打开的文件维持一张文件表(同一个文件可以被打开多次,所以同一个文件可以在文件表中占有多项)。每个文件表项包含:

       (a)、文件状态标志(读、写、添写、同步和非阻塞等)

       (b)、当前文件偏移量(不同的文件表项的V节点指向可以指向同个V节点表,也就是指向同一个真实的物理文件。因为一个文件表项里包含当前文件偏移量,所以不同的文件表项看到同一文件的偏移量可以不同,这种安排可以使每个进程都有它自己的对该文件的当前偏移量。)

       (c)、指向该文件的V节点表项的指针。


         V节点表项(全局级别?所有进程共享?推断的)

         (a)、每个打开文件(或设备)都有一个V节点结构。V节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,V节点还包含了该文件的I节点。


         总结:一个文件描述符对应一个文件表项,而一个文件表项又对应一个V节点表项。不同的文件描述符可以指向同一个文件表项(可以通过dup复制文件描述符等方式),从而指向同一个V节点表项。与此相似,不同的文件表项也可以指向同一个V节点表项。例如fd1 = open(pathname,...),fd2 = open(pathname....),因为它们各自打开了自己看到的文件,虽然是同一个文件,但是还是它们拥有不同的文件描述符,指向不同的文件表项(前面说过的,内核为所有打开的文件维持一张文件表(同一个文件可以被打开多次,所以同一个文件可以在文件表中占有多项))。不过,因为是同一个文件,所以它们的文件表项里的V节点指针指向的是同一个V节点表项。


        考虑以下情况:
       1.当两个独立的进程打开同一个文件时,情况是这样的,不同的两个【文件描述符】指向不同的两个【文件表】,但是两个【文件表】指向同一个【inode】
       故同时读写时不会影响对方的【文件位置指针】。
       2.dup和dup2
       此操作是在同一进程内,结果实质为两个不同的【文件描述符】指向同一个【文件表】,然后【文件表】指向【inode】,故会影响对象的【文件位置指针】
       dup()返回的文件描述符一定是当前文件描述符中的最小数值。
       3.硬链接和符号链接
       实际上一个目录有一个【目录文件】,此文件有很多条【目录项】,每个【目录项】记录着一个文件或者目录的信息,如文件名,索引节点号等,此时此【目录项】
       指向【inode】。创建硬链接就是在【目录文件】内加一条【目录项】,并且指向同一个【inode】,相关文件的硬链接数加1,当硬链接数为0时代表此文件不存在了,
        可以删除。而符号链接是创建一个新文件,此文件的内容为指向的文件的文件名,【目录项】指向此新文件的【inode】。只有索引节点无硬链接说明为匿名文件。


相关文章:

  • linux 第一个内核模块Hello World
  • Linux 根据端口查找进程
  • tshark命令行的使用
  • 联通iPhone,真的是狼来了?
  • GCC -L-l -D -I 参数的用法
  • 将SVN与BUG跟踪管理集成
  • Linux 内核中软中断机制
  • DAS、NAS、SAN...
  • Linux bridge 网桥模块内部数据包转发流程
  • C++ 标准库中的allocator是多余的
  • 数据结构与算法[LeetCode]—Linked List Cycle 确定单链表是否有环,并找出第一个环结点
  • 啊,目标!
  • 数据结构与算法[LeetCode]—数组中出现次数异与其他数的一个数
  • Linux 的DNS 的配置...
  • 我与网管师职业认证的钦定缘分
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • C# 免费离线人脸识别 2.0 Demo
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CSS魔法堂:Absolute Positioning就这个样
  • Druid 在有赞的实践
  • oldjun 检测网站的经验
  • React-redux的原理以及使用
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue小说阅读器(仿追书神器)
  • 基于Android乐音识别(2)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 浅谈Golang中select的用法
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 温故知新之javascript面向对象
  • 新手搭建网站的主要流程
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 找一份好的前端工作,起点很重要
  • 正则与JS中的正则
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (2)(2.10) LTM telemetry
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (十八)SpringBoot之发送QQ邮件
  • (五)MySQL的备份及恢复
  • (转)关于多人操作数据的处理策略
  • (转)甲方乙方——赵民谈找工作
  • .bashrc在哪里,alias妙用
  • .bat文件调用java类的main方法
  • .chm格式文件如何阅读
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net Core和.Net Standard直观理解
  • .NET delegate 委托 、 Event 事件
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net Web项目创建比较不错的参考文章
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net下的富文本编辑器FCKeditor的配置方法
  • .net专家(高海东的专栏)
  • .Net转前端开发-启航篇,如何定制博客园主题