unix环境高级编程-3.10-文件共享(转)-程序员宅基地

技术标签: 数据结构与算法  

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

   内核使用三种数据结果表示打开的文件。

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

   每个文件描述符相关连的是:

       文件描述符标志
      指向一个文件表项的指针。
(2)内核为所有打开文件维持一张文件表。每个文件表项包含:

        文件状态标志(包含读写,填写,同步,非阻塞等)
        当前文件偏移量
        指向该文件v节点表项的指针。
(3)每个打开的文件都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包括了该文件的i节点。这些信息是再打开文件时从磁盘上读入内存的。这些文件都是从磁盘读入内存的,所以可以快速使用这些参数。

note:linux没有使用v节点,而是使用了通用的i节点。

 

 

此图为打开文件的内核数据结构,该进程有两个不同的打开文件,一个文件打开为标准输入,另一个打开为标准输出。

 

如果两个独立进程各自打开同一个文件,则有如图所示

 

我们假设第一个进程在文件描述符3打开该文件,而另一个进程在文件描述符4上打开该文件。打开该文件的每个进程都得到一个文件表项。但对一个给定的文件只有一个v节点表项。每个进程都有自己的一个文件表项,理由是每个进程都要有对一个文件的偏移量。

下面描述上图的产生事件:

在完成每个write后,在文件表项中的当前文件偏移量增加所写的字节数,如果这是当前文件偏移量超过了当前的文件长度,则在i节点表项忠的当前文件长度被设置为当前文件偏移量。
如果用O_APPEND标志打开一个文件,则相应标志也被设置到文件表现的文件状态标志中。每次对这种具有填写标志的文件执行写操作时候,在文件表项中的当前文件偏移量标志中,首先被设置为i节点表项忠的文件长度,这就似的每次写的数据都添加到文件的当前尾端。
若一个文件用lseek函数丁文到文件的当前的尾端。则文件表项中的当前文件偏移量被设置为i节点表项中的当前文件长度。
lseek函数只修改文件表系那个忠的当前文件偏移量。没有进行任何io操作
可能有多个文件描述符指向同一个文件表项

fork 后也会发生同样的情况,此时父子进程对于每个打开文件描述符共享同一个文件表项。

note:文件描述符标志和恩见状态标志在作用域方面的区别。潜质只用与一个进程的一个进程描述符。而后者则使用语指向改给定文件表项的任何进程中的所有描述符。

 

当我们看到多个进程进行对一个文件同时操作的时候,这时候就产生了冲突,如何避免呢,那么就是下一节原子操作~
---------------------
作者:wintree
来源:CSDN
原文:https://blog.csdn.net/wallwind/article/details/6882498
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/zl1991/p/9952840.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30367543/article/details/96155533

智能推荐

HTTP Status 500 错误encountered an internal error ()-程序员宅基地

HTTP Status 500 错误报错如下:type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletExcepti...

跨期套利(期货)-程序员宅基地

# coding=utf-8from __future__ import print_function, absolute_import, unicode_literalsimport numpy as npfrom gm.api import *try: import statsmodels.tsa.stattools as tsexcept: print('请安装st...

css flex 弹性布局_星星月亮0的博客-程序员宅基地

Flex 布局教程:语法篇 – 阮一峰.tabbar{ position: absolute; top: 92%; left: 0; width: 100%; height: 8%; background-color: black; /* display: none; */ display: flex; align-items: center; justify-content: space-between;}.tabS

MATLAB符号运算(7)_叶视的博客-程序员宅基地

1)掌握定义符号对象和创建符号表达式的方法;2)掌握符号运算基本命令和规则;3)掌握符号表达式的运算法则以及符号矩阵运算;4)掌握符号微积分和符号方程求解的基本方法。

Android Studio: 编码UTF-8的不可映射字符-程序员宅基地

Android Studio 运行gradle命令时报错: 编码UTF-8的不可映射字符解决方法:在项目的module下的build.gradle中添加如下配置:tasks.withType(JavaCompile) { options.encoding = "UTF-8"}...

android 自定义进度跳,android怎么自定义进度条_郑业成的博客-程序员宅基地

先上效果图看到这样的一个设计图, 首先是拆分到底怎么来画这个图。1,一个进度的圆。2 ,2个有半圆的进度,一个实心,一个空心3,下面的半圆进度显示(文字 和 背景框)初步坐标稿了解这些了,就开始计算具体的坐标,自定义view第一步onMeasure把整个看成一个控件,那么他的高度,就是进度圆的高度,和下面进度文字背景框的高度。宽度就是外面空心进度条的宽度。然后onDraw1 先画外面空心的进度(设..._android跳过进度条

随便推点

java中的括号表示什么_Java中大括号的作用是什么?-程序员宅基地

优质回答 回答者:坛小帅大括号的作用是将其包裹的代码视为一个整体。如,类名后的大括号,就表示里面的代码组成这个类。方法名后的大括号,表示里面的代码组成了这个方法。for循环,while循环,if判断后的大括号的作用也类似,它代表了这段代码作为一个整体一起执行。其他地方的大括号作用也类似。--------------------------------------------------------..._java中的括号表示什么

idea6410看门狗watchdog移植及喂狗-程序员宅基地

//--------------------------------------------------------------------------------------------// 作者:longtian635241(longtian_huan[email protected])// 论坛ID:idea6410// 版权:idea6410// 平台:友坚idea6410开发板

智安网络丨2021网络安全技术名词新解,太有梗了!_网络安全行业新名词_智安网络的博客-程序员宅基地

假设你是个妹子,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人。你随时可以甩了现任男友,另外一位马上就能补上。这是冷备份。假设你是个妹子,同时和两位男性在交往,两位都是你男朋友。并且他们还互不干涉,独立运行。这就是双机热备份。假设你是个妹子,不安于男朋友给你的安全感。在遥远的男友未知的地方,和一位男生保持着联系,你告诉他你没有男朋友,你现在处于纠结期,一旦你和你男朋友分开了,你马上可以把自己感情转移到异地男人那里去。这是异地容灾备份。假设你是个妹子,有一位男朋友,你又付了钱给一_网络安全行业新名词

Matlab结构体符号变量转换_matlab 结构体转换-程序员宅基地

使用solve函数求解后,返回一个符号变量结构体,其结果在命令行处显示为分式,该结果极其不直观。通过将struct的sym转化为array的sym,再里利用vpa函数处理,解决上述问题。参考:https://qa.1r1g.com/sf/ask/2620849661/该解决方法无效,命令行仍旧显示分式。该解决方法无效,命令行仍旧显示分式。_matlab 结构体转换

spring 事务 mysql 锁_Spring中的事务与数据库中的锁关系_ji fi的博客-程序员宅基地

本文只先简单的介绍下Spring中的事务与DB中锁的关系。首先总结:Spring事务的实现本质上是使用的DB中的事务,而DB中的事务实现又主要依靠DB中的锁。所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁。所以大家一定要厘清DB事务与DB各种锁的原理与概念。后续我也研究一下DB锁,并结合具体的生产环境监控数据来谈谈。《以下是转载部分内容。主要是Spring事务的使用..._spring事务的锁