LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

写入数据覆盖的分析与执行

2023年6月6日 231点热度

经过上一节的介绍,我们晓得在linux中进行C语言开发时,多进程同时写数据到同一个文件,假若不留神处理,写入的数据可能会混乱。这主要是由于每位进程打开文件时,都有独立的文件表记录当前文件偏斜量的诱因。

这么,在一个进程中多次打开同一个文件同时写入数据,也可能出现数据混乱吗?答案是肯定的,还记得第10节的这张图吗?

虽然在一个进程中多次调用open函数打开同一个文件,系统也会为每次调用分配一个文件表记录当前文件偏斜量。这时linux 文件描述符,情况就和上一节介绍的多进程同时写数据到同一个文件的情况类似了,还是十分可能出现数据混乱的。

请看下边的代码:

#include#include#include#include#include#include#includeintmain(){char*filename="test.bin";intfd,fd2;fd=open(filename,O_WRONLY|O_CREAT);fd2=open(filename,O_WRONLY|O_CREAT);charbuf1[20];charbuf2[30];memset(buf1,1,sizeof(buf1));memset(buf2,2,sizeof(buf2));write(fd,buf1,sizeof(buf1));write(fd2,buf2,sizeof(buf2));close(fd);close(fd2);return0;}

代码的逻辑很简单,就是在main函数里打开test.bin文件两次,并分别往上面写入20个字节的1,和30个字节的2。编译执行之,得到如下结果:

容易看出,fd写入的数据被fd2写入的数据覆盖了,这与我们上面的剖析是一致的。

实际开发中,还是十分有可能须要打开同一个文件多次的,例如多线程项目中,每位线程都须要操作test.bin文件,这时使用多个fd愈加便捷。C语言的dup和dup2函数

好在,C语言提供的dup和dup2函数,就特别适宜解决多个fd写数据到同一个文件的需求。dup和dup2都可拿来复制一个现存的文件描述符,使两个文件描述符指向同一个文件表。

在linux中输入man命令即可查询dup函数的描述:

现今使用dup函数更改里面的代码,复制一份fd传递给fd2:

...fd=open(filename,O_WRONLY|O_CREAT);fd2=dup(fd);charbuf1[20];...

更改之后,编译执行,发觉两次写入的数据都保留了。

这是由于fd2是由dup函数复制fd而至,它俩共享同一个文件表,也即共享同一个当前文件偏斜量。上面两节介绍过,fd调用write写入数据后,会将当前文件偏斜量更新,这时fd2也就接着fd写入的数据尾部写入数据了。

再瞧瞧里面的代码,尽管fd2是复制fd而至的,并且仍需调用close函数关掉之。所以假如只执行第26行代码,linux内核只会将test.bin文件的打开计数减一linux 文件描述符,并没有真正关掉文件。因而,第27行的close(fd2);是必需的。

这也能看出多线程操作同一个文件,使用dup的用处了。某个线程使用完文件后,直接close即可(这能使代码有更好的逻辑完整性linux mint,可阅读性更强),而无需担忧其他线程。

dup函数复制fd时,总是返回尽可能小的未使用fd号。dup2函数与dup函数的功能时类似的,惟一的区别是dup2函数有两个参数,执行成功后,会返回第二个参数传递的fd值。

linux重定向符_linux 文件描述符_linux 空洞文件文件

多进程打开同一个文件时,能借助dup函数防止数据衰弱吗?

既然dup函数还能复制fdlinux运维面试题,这么,上一节出现的问题也能用dup函数的特点解决吗?这个问题就留给读者思索了。经过这两节的讨论,相信读者也有能力编撰相应的C语言代码验证自己的看法。

这儿有一点小提示:进程间一般并不共享显存,而进程打开文件时,文件表信息保留在自己的显存空间里的。

欢迎在评论区一起讨论,指责。文章都是手打原创,每晚最扼要的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以见到最新更新和之前的文章哦。

,

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 写入 函数 文件 线程 进程
最后更新:2023年6月6日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
如何在Linux系统中查看CPU信息使用lscpu命令行 linux服务器搭建ftp的6下安装vsftpd步骤及步骤 贵州工业职业技术学院求职意向期望工作地--诚聘英才 实验1Linux安装实验掌握虚拟机的使用 Linux系统tar命令的使用方法及使用命令教程 linux 开源nas系统 杰和科技NAS服务器媒体见面会在京召开 Android与Linux开发大不同 Linux系统软件安装包:自己动手,安装不用愁 车市新战局:汽车操作系统会复制智能手机的历史吗? Linux文件系统种类 如何卸载用源码包安装的软件?在线视频教程推荐 「职位」ASP.、PHP、Linux服务器集群开发 Torvalds:Linux内核开发的创新前景充满了热情 Linux文件系统的结构从终端窗口探索Linux目录树结构 卸载软件命令Linux.You linux软件开发如何入门?学习Linux步骤及学习方法介绍 14年Linux发行版的有趣历史观点 Linux中不像Windows可以直接在控制面板中卸载? 2018年波及众多Linux发行版的性能对比会更加深入 如何用源码包安装的软件?name的方法总结
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
系统消耗掉了29M的内存是被谁消耗掉的? 用集群技术构建网络服务器的发展趋势提出了 Linux内核开发者开发出kmemleak功能的原理是什么?怎么找到 ubuntu离线安装软件 鸿蒙OS环境搭建过程中遇到的问题及解决方案 linux如何用u盘安装系统教程?(linux) LinuxCronJobs提权定时任务定时 关闭虚拟机的防火墙:验证进程(上) linux系统位数最简单的命令--linux 如何在Linux使用unzip命令合并解压分卷文件文件? 研究一下Linux内存管理的32位Linux系统--虚拟地址 新公司的测试机磁盘空间空余很小简要记录以备忘 不能使用U盘和移动硬盘的确是让人倒胃口 1.3socket编程客户端-服务端基本流程图片App 嵌入式系统和基于X86的计算机系统可裁剪系统的对比 聊聊我们建站主机选择Windows还是Linux系统的问题(图) Linux上的防火墙和地址WinSCP命令使用协议的方法 【Linux基础知识】Linux内核版本命令(两种方法) (Linux命令大全)之Linux语法参数说明与使用方法 高效搭建Linux Android开发环境,轻松提升开发体验 Linux环境下,处理磁盘空间已满,导致数据库无法正常使用
标签聚合
应用 软件 linux系统 文件目录 虚拟机 内核 linux服务器 文件 操作 命令
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 78篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.