UNIX环境高级编程_文件IO_共享文件操作

news2024/12/26 10:47:26

这篇笔记记录下,多进程(包括父子进程)操作同一个文件,或者同一个文件被同一个进程多次打开时的情况,总是傻傻分不清,必须记录一下了。

1 文件IO_共享文件

分下面四种情况记录。

情况1:同一进程多次open同一个文件

在同一个进程中多次open打开同一文件时,文件描述符不可能相同,因为同一个文件描述符池中某个文件描述符被占用,在close之前,该fd无法再次被使用。
在一个进程中,两次打开同一个文件,对应的代码如下:
在这里插入图片描述
通过实验发现,hello会被world覆盖,具体原因如下:
在这里插入图片描述
每个文件描述符都对应一个文件表,因为打开同一个文件,所以每个文件表V节点指针指向相同的V节点。每个文件描述符fd指向的文件表中有自己的“文件位移量”,新创建的文件,所以文件位移量是0,从0开始写,每write一次(clase()之后),文件偏移量增加写入的字节数,如果文件偏移量超出了当前文件长度,则用文件位移量更新当前文件长度。
在上面代码中,他们写的位置重重复了,所以hello会被world覆盖。
怎样解决上面问题呢?每次都加上O_APPEND,即可解决,其原理如下:当设置A_APPEND后,每次执行写操作时,文件表项中的当前文件偏移量首先会被设置为i节点表项中的文件长度,这就使得每次写入数据都会被追加到文件的末尾处。

情况2:多个进程共享操作同一个文件

不同进程打开同一个文件时候,各自使用的文件描述符表可能相等,本例子中相等。之所以相同,因为不同的进程有独立的文件描述符池,都是0-1023的范围,打开一个文件时候,首先会从最小的开始分配。实验代码如下:
在这里插入图片描述
在这里插入图片描述
单个进程打开文件两次与两个进程同时打开文原理相同,都指向了相同的V节点,所以也会出现覆盖的情况。同样的解决方法:指定A_Append标志,写操作时候,使用文件长度去更新文件位移量。保证了各自操作时,都在文件的末尾操作,就不会出现覆盖的情况。

情况3: 父子进程共享同一文件

父子进程共享文件和情况2中的多进程共享文件的原理相同,出现覆盖的原因相同。

	int main()
{
	pid_t ret = 0;
	ret = fork();
	if (ret > 0) // parent pid
	{
		int fd = 0;
		fd = open("./file.txt ",O_RDWR|O_CREAT,0664);
		write(fd,"hello\n",6);
	}
	else if(ret == 0) // child pid
	{
		int fd = 0;
		fd = open("./file.txt ",O_RDWR|O_CREAT,0664);
		write(fd,"world\n",6);
	}

	//while(1);
	return 0;
}

在这里插入图片描述
子进程和父进程指向相同的V节点表,它们拥有各自的独立的文件读写位置,刚开始都是0开始写,又会出现情况2中的覆盖,如果不想相互覆盖,需要加O_APPEND标志。

情况4: fork之前打开文件,会出现什么情况?

代码如下:

int main()
{

	pid_t ret = 0;
	
	int fd = 0;

	fd = open("./file.txt ",O_RDWR|O_CREAT|O_APPEND,0664);

	ret = fork();
	if (ret > 0) // parent pid
	{
		write(fd,"hello\n",6);
	}
	else if(ret == 0) // child pid
	{
		write(fd,"world\n",6);
	}

	//while(1);
	return 0;
}

上面代码中情况如下:
子进程会继承父进程已经打开的文件描述符,所以子进程和父进程的fd都指向了相同的文件表。由于共享相同的文件表,所以父子进程拥有共同的读写位置,不会出现写覆盖的情况。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP MESSAGE :000 消息提示「BUG」

SAP MESSAGE :000 消息提示 错误消息 问题分析 前言&#xff1a;这个问题 DEBUG 模式没有抓到&#xff0c;所以才有了下文&#xff1a; 这是迁移程序时会出现的问题&#xff0c;参见下面的图片&#xff1a; 在迁移前&#xff0c;MATNR 转码 FUNC 就没有规范书写 sy-subrc <…

第十三章 常用类(包装类和String 相关类)

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据的转换 &#xff08;1&#xff09;jdk5 前的手动装箱和拆箱方式 public cl…

好友靠JVM成功进入阿里,阿里P8力荐的JVM笔记到底有什么魔力?

大家都是有经验的Java开发人员&#xff0c;想想为何要学习JVM? [面试?调优?装逼? ] 不管出于何种原因&#xff0c;总之你得先学好。那怎么学好呢? 每个人对于JVM的了解可能不一样&#xff0c;这就要考虑到怎么切入 既然大家都学习过Java&#xff0c;那不妨就从Java开始…

数据分析思维(四)|分类/矩阵思维

分类与矩阵思维 1、概念 在进行数据分析工作时&#xff0c;我们往往会涉及到多个核心指标&#xff0c;而对于不同数值核心指标的结合又会产生多种不同的结果&#xff0c;我们将相似结果的内容放到一起进行统一决策就会大大节省数据分析的时间&#xff0c;这种思想我们称之为分…

[python入门㊲] - python的继承

目录 ❤ 什么是继承 ❤ 派生和继承 ❤ 单继承 ❤ 多继承 ❤ MRO[方法搜索顺序](多继承顺序) ❤ 新式类和旧式&#xff08;经典&#xff09;类 ❤ 什么是继承 通过继承基类来得到基类的功能 所以我们把被继承的类称作父类或基类&#xff0c;继承者被称作子类 可…

注册外贸公司需要注意的问题

关于注册海外公司需要注意事项&#xff0c;米贸搜以美国为例&#xff0c;整理以下信息&#xff0c;希望可以帮助到你一、注册美国公司注意事项&#xff1a;1、拟定要注册的美国公司名称三个&#xff08;英文&#xff09;&#xff0c;核名如无重复则可使用&#xff1b;2、美国公…

matlab机电耦合系统相位分岔图

1、内容简介略638-可以交流、咨询、答疑2、内容说明略3、仿真分析clcclose allclear%% parameterglobal CC 48;tspan [0 5]; % 仿真时间x0 [0.1 0.1 0.1 0.1]; % 变量初始值[T,X] ode45(model_diff, tspan, x0); % 调用求解器X3_dot [0;diff(X(:,3))./diff(T)]; % 求解x3的…

【已解决】SpringCloudConfig客户端启动无法读取到配置参数

自己部署了一个Spring Cloud微服务项目&#xff0c;实践Spring Cloud Config分布式配置组件&#xff0c;按照Spring Cloud Config 资料Config&#xff1a;Spring Cloud分布式配置组件 先后创建了Eureka注册中心服务、 Spring Cloud Config Server服务、 Spring Cloud Config Cl…

极客星球 | Elasticsearch入门与实战技术分享

为持续夯实MobTech袤博科技的数智技术创新能力和技术布道能力&#xff0c;本期极客星球邀请了MobTech企业服务研发部工程师勤佳&#xff0c;从Elasticsearch集群安装、DSL语句讲解、深度分页、IK分词器、滚动索引等方面进行了阐述和分享。 一、集群环境安装 elasticsearch 是…

节后转岗“浪潮”来了!瞅准“趋势向上”的行业!

“跨行跨岗人员&#xff0c;怎么能顺利转行&#xff1f;”的话题一直存在&#xff01;成功人士给出一条转岗转行的原则&#xff1a;迁移到技能相近但趋势向上的岗位。那么&#xff0c;什么叫“技能相近”和“趋势向上”呢&#xff1f;让我们来看看。趋势向上除了技能相近&#…

现阶段元宇宙经常偏离原有的发展轨道,使其失去该有的功能和意义

人们总是会自然地陷入到约定俗成的俗套之中。对于元宇宙&#xff0c;同样未能免俗。即使是那些处于头部的玩家&#xff0c;亦不例外。比如&#xff0c;扎克伯格就仅仅只是将元宇宙看成了一个将脸书带离泥潭的工具&#xff0c;一味地迎合资本&#xff0c;而最终忽略了元宇宙最本…

日常避坑--input输入框type=number仍可以输入“e“,“.“等符号

问题发现在使用ElementUI的input框时候&#xff0c;我们有时候需要只让用户输入数字类型。这个时候你可能就会想到<input type"number">,思路没错&#xff0c;但是踩着坑啦。我定义了一个number类型的input框但是&#xff0c;输入框仍旧可以输入"e",…

hadoop安装(二、hadoop)(备忘)

hadoop安装hadoop更改文件配置配置core-site.xml配置hadoop-env.sh配置hdfs-site.xml配置mapred-site.xml配置yarn-site.xml配置环境hadoop安装安装hadoop 紧接上文&#xff0c;解压过的hadoop內部文件为 再进入etc内部的hadoop 修改hadoop313的权限 在/opt目录下&#xff0…

分享24个网页游戏源代码,总有一个是你想要的

分享24个网页游戏源代码 24个游戏源代码下载链接&#xff1a;https://pan.baidu.com/s/1gYJlj8enJbh5mFS_wMaZBA?pwd4ncb 提取码&#xff1a;4ncb 下面是项目的名字&#xff0c;我放了一些图片&#xff0c;大家下载后可以看到。 Html5JS网页版捕鱼达人游戏 HTML5水果忍者游戏…

杂谈---名言警句记录

我们总喜欢拿顺其自然来敷衍人生道路上的荆棘与坎坷,却很少承认真正的顺其自然其实是竭尽所能之后的不强求,而并非两手一摊的不作为.没有那一次巨大的历史灾难,不是以历史的进步作为补偿.今日长缨在手,何时缚住苍龙?男人遇到真爱时第一反应是胆怯&#xff0c;女人遇到真爱的第…

这份2023软件测试面试技巧,助你拿下满意offer

求职&#xff0c;就像打仗&#xff0c;不仅是一场挑战自己的战斗&#xff0c;也是一场与用人单位的较量。而求职者只有准备足够充分&#xff0c;才能在这场毫无硝烟的“战场”上取得胜利。那么软件测试面试需要做哪些准备以及软件测试面试需要哪些技巧呢&#xff1f;1、熟悉岗位…

JDBC数据库连接池

目录JDBC原理图1. 数据库连接的5种方式2.ResultSet底层3.Statement sql注入3.1 PreparedStatement4. Jdbc工具类4.1 工具类应用5.Jdbc事务6.批处理6.1 批处理原理7.数据库连接池7.1 c3p07.2 德鲁伊7.2.1 德鲁伊工具类8.Apache-DBUtils工具类8.1多条查询&#xff0c;BeanListHan…

Web3中文|火遍全网的去中心化推特「Damus」是什么?(附操作指南)

Damus是一个建立在去中心化网络上的社交软件&#xff0c;被称为“推特杀手”&#xff0c;现已在苹果应用商店上线。 1月31日&#xff0c;Damus团队在推特上证实了这一消息&#xff0c;此前该团队称已经被苹果公司拒绝了至少三次。 不久之后&#xff0c;Twitter联合创始人Jack…

Anaconda3安装

Anaconda3安装 step1 下载Anaconda 网址&#xff1a;https://www.anaconda.com/products/individual 点击红色方框中的Download下载最新版本的Anaconda软件&#xff0c;可选择windows/Linux/Mac系统。 Step2 安装过程 双击.exe文件 2.选择Next>,进行下一步。 3.点击 …

论文投稿指南——中文核心期刊推荐(水产、渔业)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…