- 浏览: 141283 次
文章分类
最新评论
UNIX系统支持在不同进程间共享打开文件。为说明这种这种共享,需要先介绍内核用于所有I/O 的数据结构。
内核使用三种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个可能产生的影响。这三种数据结构说明如下:
(1) 每个进程在进程表中都有一个记录项,记录项中包含一张文件描述符表,可将其视为一个矢量,每个描述符占用一项,与每个描述符相关联的是:
a. 文件描述符标志;
b. 指向一个文件表项的指针。
(2) 内核为所有打开文件维持一张文件表,每个文件表项包含:
a. 文件状态标志(读、写、添写、同步和非阻塞等);
b. 当前文件偏移量;
c. 指向该文件 v 节点表项的指针。
(3) 每个打开文件(或设备)都有一个 v 节点(v-node)结构(注:Linux 没有使用 v 节点,而是使用了通用 i 节点结构。虽然两种实现有所不同,但在概念上还是一样的,两者都指向文件系统特有的 i 节点结构)。它包含了文件类型和对此文件进行各种操作函数的指针。对于大多数文件,v 节点还包含了该文件的 i 节点(i-node,索引节点)。这些信息是在打开文件时从磁盘上读入内存的,所以文件的所有相关信息都是随时可用的。例如,i 节点包含了文件的所有者、文件长度、指向文件实际数据块在磁盘上所在位置的指针等。
在此,我们忽略了那些不影响讨论的实现细节。例如,打开文件描述符表可存放在用户空间(作为一个独立的对应于每个进程的结构,可以换出),而非进程表中。这些表也可用多种方式实现,可以是数组,也可以是结构链表。下图显示了一个进程对应的三张表之间的关系。该进程有两个不同的打开文件:一个文件从标准输入打开(文件描述符0),另一个从标准输出打开(文件描述符为1)。
根据这张表,当两个独立的进程打开了同一文件时,就会有类似下图的关系。
这里,打开该文件的每个进程都获得各自的一个文件表项(也可能有多个文件描述符项指向同一文件表项,比如使用 dup 函数时,另外在 fork 后也会发生同样的情况,此时父进程、子进程各自的每一个打开文件描述符共享同一个文件表项),以便每个进程都有它自己的对该文件的当前偏移量,但对一个给定的文件只有一个 v 节点表项。
在给出了这些数据结构后,就可作进一步说明。
* 在完成每个 write 后,在文件表项中的当前文件偏移量即增加所写入的字节数。如果这导致当前文件偏移量超出了当前文件长度,则将 i 节点表项中的当前文件长度设置为当前文件偏移量(也就是该文件加长了)。
* 如果用 O_APPEND 标志打开一个文件,则相应标志也被设置到文件表项的当前状态标志中。每次对这种具有追加写标志的文件执行写操作时,文件表项中的当前文件偏移量首先会被设置为 i 节点表项中的文件长度。这就使得每次写入的数据都追加到文件的当前尾端处。
* 若一个文件用 lseek 定位到文件当前的尾端,则文件表项中的当前偏移量被设置为 i 节点表项中的当前文件长度。
* lseek 函数只修改文件表项中的当前文件偏移量,不进行任何 I/O 操作。
最后要注意的是,文件描述符标志和文件状态标志在作用范围方面的区别,前者只用于一个进程的一个描述符,而后者则应用于指向该给定文件表项的任何进程中的所有描述符。
内核使用三种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个可能产生的影响。这三种数据结构说明如下:
(1) 每个进程在进程表中都有一个记录项,记录项中包含一张文件描述符表,可将其视为一个矢量,每个描述符占用一项,与每个描述符相关联的是:
a. 文件描述符标志;
b. 指向一个文件表项的指针。
(2) 内核为所有打开文件维持一张文件表,每个文件表项包含:
a. 文件状态标志(读、写、添写、同步和非阻塞等);
b. 当前文件偏移量;
c. 指向该文件 v 节点表项的指针。
(3) 每个打开文件(或设备)都有一个 v 节点(v-node)结构(注:Linux 没有使用 v 节点,而是使用了通用 i 节点结构。虽然两种实现有所不同,但在概念上还是一样的,两者都指向文件系统特有的 i 节点结构)。它包含了文件类型和对此文件进行各种操作函数的指针。对于大多数文件,v 节点还包含了该文件的 i 节点(i-node,索引节点)。这些信息是在打开文件时从磁盘上读入内存的,所以文件的所有相关信息都是随时可用的。例如,i 节点包含了文件的所有者、文件长度、指向文件实际数据块在磁盘上所在位置的指针等。
在此,我们忽略了那些不影响讨论的实现细节。例如,打开文件描述符表可存放在用户空间(作为一个独立的对应于每个进程的结构,可以换出),而非进程表中。这些表也可用多种方式实现,可以是数组,也可以是结构链表。下图显示了一个进程对应的三张表之间的关系。该进程有两个不同的打开文件:一个文件从标准输入打开(文件描述符0),另一个从标准输出打开(文件描述符为1)。
根据这张表,当两个独立的进程打开了同一文件时,就会有类似下图的关系。
这里,打开该文件的每个进程都获得各自的一个文件表项(也可能有多个文件描述符项指向同一文件表项,比如使用 dup 函数时,另外在 fork 后也会发生同样的情况,此时父进程、子进程各自的每一个打开文件描述符共享同一个文件表项),以便每个进程都有它自己的对该文件的当前偏移量,但对一个给定的文件只有一个 v 节点表项。
在给出了这些数据结构后,就可作进一步说明。
* 在完成每个 write 后,在文件表项中的当前文件偏移量即增加所写入的字节数。如果这导致当前文件偏移量超出了当前文件长度,则将 i 节点表项中的当前文件长度设置为当前文件偏移量(也就是该文件加长了)。
* 如果用 O_APPEND 标志打开一个文件,则相应标志也被设置到文件表项的当前状态标志中。每次对这种具有追加写标志的文件执行写操作时,文件表项中的当前文件偏移量首先会被设置为 i 节点表项中的文件长度。这就使得每次写入的数据都追加到文件的当前尾端处。
* 若一个文件用 lseek 定位到文件当前的尾端,则文件表项中的当前偏移量被设置为 i 节点表项中的当前文件长度。
* lseek 函数只修改文件表项中的当前文件偏移量,不进行任何 I/O 操作。
最后要注意的是,文件描述符标志和文件状态标志在作用范围方面的区别,前者只用于一个进程的一个描述符,而后者则应用于指向该给定文件表项的任何进程中的所有描述符。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1249在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1540伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 794多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 944终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 567尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 937虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 707tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 810终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 434终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 577在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 945在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 614在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 492消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 482有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 413FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 384管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 879readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 452POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 591记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 433UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
HTTP文件共享小工具是一款便捷高效的文件分发和共享解决方案,尤其适合在局域网或互联网环境中快速分享大文件。这款小软件以其简单的设置流程、快速的传输速度和出色的稳定性赢得了用户的青睐。 首先,我们来了解...
### Windows 10 文件共享不安全问题解析及解决方法 #### 一、问题概述 在使用Windows 10操作系统访问共享文件时,可能会遇到“因为文件共享不安全,所以你不能连接到文件共享”的提示。这主要是由于系统默认禁用了...
Linux 文件共享服务是将Linux系统中的文件和目录暴露给网络中的其他系统,以便进行数据交换和协作。在Linux中,有几种主要的文件共享服务,包括Samba、FTP(使用vsftpd)以及NFS(网络文件系统)。下面将详细介绍...
在Windows Server 2016操作系统中,文件共享配额是一项重要的管理功能,它允许管理员控制用户或特定文件夹的存储使用量。设置配额的主要目的是有效地管理存储资源,防止个别用户或文件夹过度占用存储空间,从而影响...
联想工程师专用小工具 文件共享工具V3.52.1联想工程师专用小工具 文件共享工具V3.52.1联想工程师专用小工具 文件共享工具V3.52.1联想工程师专用小工具 文件共享工具V3.52.1联想工程师专用小工具 文件共享工具V3.52.1...
在局域网内实现文件共享功能,Python提供了多种方法,其中最基础的是使用内置的`sockets`模块。本篇文章将详细探讨如何使用Python的sockets模块来创建一个简单的局域网文件共享系统。 首先,我们要了解局域网文件...
虚拟机 LINUX 与主机 WINDOWS 文件共享 在虚拟机 LINUX 和主机 WINDOWS 之间实现文件共享需要使用 SAMBA 服务器。 SAMBA 是一个功能强大的开源软件,可以实现 LINUX 和 WINDOWS 之间的文件共享。下面将详细介绍如何...
阡陌局域网文件共享软件是一款专为解决局域网内文件共享问题而设计的应用程序。在Windows操作系统环境中,设置文件夹共享往往涉及到复杂的网络配置和权限设定,这对于普通用户来说可能较为困难,而且不同版本的...
php实现文件共享(其于windows网上邻居原理) 通过本php文件,在进行相关设置后,您可以方便的看到共享目录中的文件,以及相应的说明,便于能够迅速找到自己想要的文件。 找到想要的东西后,直接点击文件夹名打开...
标题中的“-远程文件共享工具-”指的是用于在网络上分享文件的工具,这类工具允许用户将本地计算机上的文件通过网络提供给他人访问或下载。在描述中提到的功能是生成临时网址,然后将这个网址发送给朋友,使他们...
"基于Linux和windows之间文件共享网络服务研究" 本文研究了基于Linux和Windows之间文件共享网络服务,解决了Linux和Windows操作系统之间文件共享的问题。论文中介绍了使用Samba服务来实现文件共享,详细介绍了Samba...
【标题】:“p2p文件共享程序” 【描述】:“p2p文件共享程序 java课程设计 java设计……” 本文将详细解析基于Java实现的P2P(peer-to-peer)文件共享程序的设计与实现,这是一种利用互联网技术让网络中的每个...
### 在VMware的Ubuntu虚拟机中实现与Windows文件共享 #### 环境配置与准备工作 在本教程中,我们将详细介绍如何在VMware Workstation环境下搭建一个Ubuntu虚拟机,并实现Ubuntu虚拟机与宿主机(假设为Windows操作...
- 在局域网内实现文件共享,一般可以采用SMB(Server Message Block)协议,这是一种由Microsoft开发的网络文件共享协议,Delphi可以通过Windows API调用SMB服务进行文件共享操作。 4. **源码解析**: - "delphi...
阡陌 3.1.8.1 局域网文件共享工具是一款专为解决传统“网上邻居”功能不便而设计的应用程序。在Windows系统中,虽然内置了“网上邻居”功能,但用户在进行局域网内的文件共享时可能会遇到速度慢、连接不稳定或操作...
"Linux系统下用Samba工具实现文件共享及共享打印机的配置" Linux系统下用Samba工具实现文件共享及共享打印机的配置是指使用Samba工具在Linux系统下实现文件共享和共享打印机的配置,这个过程需要对Samba工具的配置...
【标题】:“jsp办公室文件共享系统” 【描述】:这个办公室文件共享系统是基于BS(Browser-Server)架构设计和实现的,旨在提供一个高效、便捷的文件共享平台,使得办公室内的员工能够轻松地访问、存储和协作处理...
局域网文件共享服务器搭建初稿方案 一、服务器搭建 在局域网文件共享服务器搭建中,我们需要首先创建用户账户和组管理。 Step1 中,我们需要右键单击【我的电脑】图标,选择【管理】命令,打开“计算机管理”窗口...
HTTP方式的文件共享是互联网上常见的数据交换方法之一,它基于超文本传输协议(Hypertext Transfer Protocol),允许用户从Web服务器下载或上传文件。这种共享机制简单、高效且广泛应用于各种在线服务,如网站、云...