公司法
当前位置: 首页 法律大全

linux multipath配置详解(复制一个文件描述符)

时间:2023-05-24 作者: 小编 阅读量: 1 栏目名: 法律大全

因此,第27行的close;是必需的。dup函数复制fd时,总是返回尽可能小的未使用fd号。dup2函数与dup函数的功能时类似的,唯一的区别是dup2函数有两个参数,执行成功后,会返回第二个参数传递的fd值。经过这两节的讨论,相信读者也有能力编写相应的C语言代码验证自己的想法。

经过上一节的介绍,我们知道在 linux 中进行 C语言开发时,多进程同时写数据到同一个文件,如果不小心处理,写入的数据可能会混乱。这主要是因为每个进程打开文件时,都有独立的文件表记录当前文件偏移量的原因。

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

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

请看下面的代码:

#include <stdio.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/wait.h>int main(){ char* filename = "test.bin"; int fd, fd2; fd = open(filename, O_WRONLY|O_CREAT); fd2 = open(filename, O_WRONLY|O_CREAT); char buf1[20] ; char buf2[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); return 0;}

代码的逻辑很简单,就是在 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);char buf1[20] ;...

修改以后,编译执行,发现两次写入的数据都保留了。

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

再看看上面的代码,虽然 fd2 是复制 fd 而来的,但是仍需调用 close 函数关闭之。所以如果只执行第 26 行代码,linux 内核只会将 test.bin 文件的打开计数减一,并没有真正关闭文件。因此,第 27 行的 close(fd2); 是必需的。

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

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

多进程打开同一个文件时,能利用 dup 函数避免数据紊乱吗?

既然 dup 函数能够复制 fd,那么,上一节出现的问题也能用 dup 函数的特性解决吗?这个问题就留给读者思考了。经过这两节的讨论,相信读者也有能力编写相应的 C语言代码验证自己的想法。

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

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

,
    推荐阅读
  • 怎样养好盆栽百合花(盆栽百合花又香又高贵)

    怎样养好盆栽百合花百合开花香气浓郁,艳丽而娇嫩,含苞待放,芬芳吐蕊,是特别深受人们喜爱的一种花卉。在选择的时候一定要选择正规的商家,选择对版的百合才能符合自己的心愿。大约两个月左右,就可以看到百合花开出艳丽的花朵了。百合花开完花之后不要丢掉,直接把它的残花修掉就可以了。

  • 绵阳市有哪些旅游景点好玩(旅行攻略之四川省绵阳市)

    绵阳又称为“中国科技城”,位于四川西北部盆地。风景优美,家人爬爬山不错,有天然溶洞)六:越王楼七:潼川古城(历史悠久,晚上夜景很不错。我国两弹就是在这里研究成功的。是个不错的打卡地)以上十个都是不错的景点,绵阳美食也有很多,米粉、锅盔、冒菜、酥饼、凉粉、醪糟、片粉、还有很多美食,大家可以去品尝一下

  • 忍界大战我爱罗带什么秘卷(这样带秒杀敌人)

    忍界大战我爱罗带什么秘卷带水龙卷和查克拉,水龙卷追踪可以更好地封走位,查克拉能配合大招迅速击杀敌人。在第四代风影遇刺不久后继任成为第五代风影,领导并守护着砂隐村,曾一度被“晓”抽去了一尾守鹤而死亡,最后被千代牺牲性命复活。第四次忍界大战中,我爱罗担任忍者联军队长与第四部队统领。战争结束后,我爱罗仍继续担任风影的职位,还和鸣人及木叶村等人维持着友好的关系。

  • 长春有哪些专科学校(长春的专科学校有哪些)

    师范教育部组建),是吉林省、长春市政府在“十二五”期间重点扶持建设的全省唯一一所师范高等专科学校。长春医学高等专科学校,是经教育部批准的全日制普通高等专科学校,“卓越医生教育培养计划”试点高校。

  • 明日之后夜魔是什么(夜魔特点介绍)

    明日之后夜魔是夜晚出现的野怪每当夜幕降临时,玩家总会收到一条特殊的提醒,那就是连续不断的紧凑三声喇叭声,并提示玩家“喇叭声唤醒了什么”,下面我们就来聊聊关于明日之后夜魔是什么?明日之后夜魔是什么明日之后夜魔是夜晚出现的野怪。其实,这个喇叭声唤醒的就是“夜魔”,出现这条提醒之后,也将意味着在不久过后有一位夜魔大人将亲自光顾你的家园,并向你寒暄温暖,表达最衷心的祝福!

  • 三本末世流小说推荐(10本末日基建玄幻类文)

    幸好“末日营地”游戏自由度极高。公测结束,她满心期待游戏正式运营,不料全球沦为游戏场……袁香儿学艺初成,入妖林,欲擒一小妖,契之以为使徒。袁香儿心中不忍,将其带回家中,哺食裹伤,悉心照料。至此之后,每天外出归来的袁香儿欣喜的发现家门口总会多出一些奇怪的礼物。小招待所内水电齐全,只要支付晶核就可以获得安全的居所美味的食物。

  • 哄女朋友的暖心故事(哄女友开心的故事)

    问老总老总,大家这儿有木有红萝卜?仔猪太胖了,猪妈妈担忧仔猪的身心健康,让仔猪减肥瘦身,猪妈妈每日监管仔猪慢跑。此刻小狗狗来找仔猪,猪妈妈恰好让小狗狗监管仔猪,小狗狗同意了猪妈妈。临行的情况下,猪妈妈刻意交待仔猪不可以喝凉水和吃凉的物品。仔猪开心的吃完起來,但是还没有等吃了,仔猪就肚子痛的倒在了地底,此刻猪妈妈正巧回家,立刻带著仔猪来到医院门诊。

  • 2060打游戏好吗(2060不仅节目全网出圈广受好评)

    10月22日起,江苏卫视推出了一档国产原创动漫形象舞台竞演节目《2060》,在每周五晚间时段播出。截至目前,《2060》已播出五期节目,CSM63城平均收视2.34%、收视份额11.57%。《2060》自开播以来,凭借新颖的节目模式以及弘扬中国传统文化的内核,获得了业内外各方的关注和肯定。文章还着重表扬了《2060》节目用好国风元素弘扬优秀传统文化,并采用年轻化表达贴近青少年喜好。

  • 新宝骏十年磨剑苦工一朝转型成功(新宝骏形象店什么样)

    在服务方面,新宝骏将会提供全生命周期的实施在线服务,通过APP实现从预约到服务完结的全面在线化。不仅如此,新宝骏还将提升服务水平,将会对到店的每一位消费者提供6对1的专属服务,包括店长、销售顾问、服务顾问、技术主管、保险专员和客服专员,给用户提供实时在线响应,为用户日常用车进行保驾护航。而且,新宝骏提供了在线预约和上门取车保养的服务,让您可以足不出户完成车辆保养。

  • 贵州赤水丹霞大瀑布美景迷人(赤水大瀑布难得一见的)

    在贵州赤水丹霞旅游区大瀑布景区,壮美的大瀑布气势恢宏。据了解,按照疫情防控要求,游客在进入景区时需要进行扫码、测温。景区还采取了门票线上预约、错峰游览等措施。此外,为应对假期客流,当地加强了车辆运力调控、增加工作人员值守,优化客流引导。