热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

文件I/O(不带缓冲)之文件共享

UNIX系统支持在不同进程间共享打开的文件。内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。(1)每个进程在进程表中都有一个记录项,记录项

UNIX系统支持在不同进程间共享打开的文件。

内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。

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

        (a)文件描述符标志(close_on_exec)。进程中每个打开描述符都有一个执行时关闭(close_on_exec)标志,若此标志设置,则在执行exec时关闭该描述符,否则该描述符仍打开。除非特地用fcntl设置了该标志,否则系统默认操作是在执行exec后仍保持该描述符打开。

        (b)指向一个文件表项的指针。

(2)内核为所有打开文件维持一张文件表。每个文件表项包含:

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

        (b)当前文件偏移量。

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

(3)每个打开文件(或设备)都有一个v节点(v-node)结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包含了该文件的i节点(i-node,索引节点)。这些信息是在打开文件时从磁盘上读入内存的,所以所有关于文件的信息都是快速可供使用的。例如,i节点包含了文件的所有者、文件长度、文件所在的设备、指向文件实际数据块在磁盘上所在位置的指针等。

注:Linux没有使用v节点,而是使用了通用i节点结构。虽然两种实现有所不同,但在概念上,v节点与i节点是一样的。两者都指向文件系统特有的i节点结构。

图3-1显示了一个进程的三张表之间的关系。该进程有两个不同的打开文件:一个文件打开为标准输入(文件描述符0),另一个打开文件为标准输出(文件描述符为1)。从UNIX系统的早期版本以来,这三张表之间的基本关系一直保持至今。这中安排对于在不同进程之间共享文件的方式非常重要。

创建v节点结构的目的是对在一个计算机系统上的多个文件系统类型提供支持。这一工作是由Peter Weinberger(贝尔实验室)和Bill Joy(Sun公司)分别独立完成的。Sun称此种文件系统为虚拟文件系统(Virtual File System),称与文件系统类型无关的i节点部分为v节点。

Linux没有将相关数据结构分为i节点和v节点,而是采用了一个独立与文件系统的i节点和一个依赖于文件系统的i节点。

20130925143426125

如果两个独立进程各自打开了同一个文件,则有图3-2中所示的安排。我们假定第一个进程在文件描述符3上打开该文件,而另一个进程则在文件描述符4上打开该文件。打开该文件的每一个进程都得到一个文件表项,但对一个给定的文件只有一个v节点表项。每个进程都有自己的文件表项的理由是:这种安排使每个进程都有它自己的对该文件的当前偏移量。

1354634677_1356

  • 在完成每个write后,在文件表项中的当前文件偏移量即增加所写的字节数。如果这使当前文件偏移量超过了当前文件长度,则在i节点表项中的当前文件长度被设置为当前文件偏移量(也就是该文件加长了)。
  • 如果用O_APPEND标志打开了一个文件,则相应标志也被设置到文件表项的文件状态标志中。每次对这种具有添加标志的文件执行写操作时,在文件表项中的当前文件偏移量首先被设置为i节点表项中的文件长度。这就使得每次写的数据都添加到文件的当前尾端处。
  • 若一个文件用lseek定位到文件当前的尾端,则文件表项中的当前文件偏移量被设置为i节点表项中的当前文件长度。(注意,这与用O_APPEND标志打开文件是不同的。)
  • lseek函数只修改文件表项中的当前文件偏移量,没有进行任何I/O操作。

可能有多个文件描述符项指向同一个文件表项。例如,使用dup函数时。在fork后也会发生同样的情况,此时父、子进程对于每一个打开文件描述符共享同一个文件表项。

注意,文件描述符标志和文件状态标志在作用域方面的区别,前者只用于一个进程的一个描述符,而后者则适用于指向该给定文件表项的任何进程中的所有描述符。

关于文件描述符标志和文件状态标志的区别更直白的解释,可参考:http://blog.csdn.net/bayji/article/details/6020459

 

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/


推荐阅读
  • Swoole是针对PHP的生产级异步编程框架。它是一种用纯C语言编写的PHP扩展,它使PHP开发人员能够在PHP中编写高性能,可扩展的并发TCP ... [详细]
  • 102安装Linux系统
    安装Linux系统 安装CentOS系统准备系统光盘插入CentOS7光盘,引导安装程序设置主机,将光盘作为第一-引导设备从CentOS7光盘启动主机检测安装光盘的完整性从ISO镜 ... [详细]
  • Nginx简介Nginx(enginex)是一个高性能的HTTP和反向代理服务器,也是一个IMAPPOP3SMTP代理服务器。Nginx是由IgorSysoev为 ... [详细]
  • 闲话少说,直接切入主题,之前也是用一下其他的IDE,但是总是在vi和IDE之间来回切换,比较麻烦,于是乎,找了几个插件亲身体验,功能挺不错;1、安装vi7.0vim的官方网站是:www.vmuni ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Lunix历史及如何学习
    1.Lunix是什么1.1Lunix是操作系统还是应用程序Lunix是一套操作系统,它提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构, ... [详细]
  • hadoop完全分布式搭建
    原文链接:hadoop完全分布式搭建主机分配以及地址要求:角色主机名IP地址Namenodemaster192.168.222.201Datanodeslave ... [详细]
  • 零入门kubernetes网络实战15>基于golang编程实现给ns网络命名空间添加额外的网卡
    《零入门kubernetes网络实战》视频专栏地址https:www.ixigua.com7193641905282875942本篇文章视频地址(稍后上传)本篇文章主要是想通过g ... [详细]
  • linux文件系统和挂载
    创建ISO文件cpdevcdrom目的地.isomkfs命令生成对应·的文件系统但是使用mkfs没有办法修该生成的系统文件的某些特性,例如标记LABEL,如果强行修改会导致文件里面 ... [详细]
  • mysql mmm搭建_搭建mysqlmmm高可用MySQL集群
    实验需求:配置mysql-mmm,实现mysql的高可用MySQL-MMM实现MySQL高可用http:www.linuxidc.comLinux201 ... [详细]
  • 缓存的重要性就不用再强调了,@OutputCache给我们提供了一种声明的方式(对应的还有编程的方式)来控制页面和用户控件的缓存策略,这是一种最简单直接的网站优化方式。还是先来过一遍@ ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
author-avatar
刘胜良昭桂家贤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有