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

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厘米左右,土要湿润一些,模拟大葱的生长环境,吃的时候随时拔出来一颗,这样可以保存几个月之久大葱也非常新鲜。

  • 梭子蟹烧熟能放多久 梭子蟹多久能煮熟

    2、梭子蟹中含有丰富的蛋白质成分,而且又经过了油盐的烹饪,因此在一定温度条件下,很容易滋生细菌而变质,若是将烧熟的梭子蟹直接置于常温下存放,一般在只能保存6-8小时左右;3、若是将其置于冰箱保存,一般保存时间相对会长一些,但是也不宜超过一天,烧熟的梭子蟹保存时间越长,其鲜味越差,所以一般建议梭子蟹最好是现做现吃,尽量不要留到下一顿。

  • 南昌大学是国内双一流建设高校么(南昌大学入选部省合建)

    日前,教育部召开支持和提升中西部高等教育发展座谈会,部署启动部省合建工作。陈宝生表示,支持举措要体现合力,在不改变现有隶属关系和管理体制基础上,发挥部、省、校和支援方的作用。还要选优配强合建高校领导班子,将合建高校领导班子成员、校级后备干部列入直属高校干部培训计划。期待南昌大学发挥辐射带动作用我省有教育界人士表示,南昌大学作为我省唯一的211高校,此次入选“部省合建”高校是实至名归。

  • 直角锐角平角钝角之间的区别于联系是什么(直角锐角平角钝角之间的区别于联系是啥)

    接下来我们就一起去研究一下吧!等于180度的角是平角,大于90度小于180度的角是钝角。锐角、直角、钝角是对大于0°并且小于180°的角的一个分类,锐角、直角、钝角间的区别在于角的大小不同。

  • 极端危害环境是指(极端危害环境是指什么)

    极端危害环境是指极端危害环境是指在低温、高碱、高盐、高压、缺水等极其不适合生物生长的环境。而在这种恶劣贫瘠的极端环境中还能够很好地生活的微生物被称为极端微生物,这些极端微生物代表着生命活动的极限。大多数电子产品设计要求参数当中都有要求在极端环境下产品能够正常工作。极端温度极端温度是指产品工作的环境最高和最低温度范围。通常室温认为是25度。

  • 布面鼠标垫属于什么垃圾(布面鼠标垫属于哪些垃圾)

    以下内容希望对你有帮助!布面鼠标垫属于什么垃圾布面鼠标垫属于可回收垃圾可回收垃圾就是可以再生循环的垃圾。本身或材质可再利用的纸类、硬纸板、玻璃、塑料、金属、人造合成材料包装等,与这些材质有关的如:报纸、杂志、广告单及其它干净的纸类等皆可回收。另外包装上有绿色标章是属于要付费的双系统,属于可回收垃圾。

  • 民间谚语大全实用又有趣( 百姓民间气象谚语民谣大全)

    每月两节日期定,最多相差一两天,上半年来六甘一,下半年是八甘三。按照公历来推算,每月两气不改变。抓紧季节忙生产,种收及时保丰年。常刮西北风,近日天气晴。无风起横浪,三天台风降。当阴雨天气来临时,云层比较低,云底盖住山顶。乌头风白头雨“乌头”与“白头”是指两种云的云顶颜色来说的。卷积云一般出现在五千米以上的高空,形成后只能维持几分钟到一个多小时。出现这种云,表明地上空有低压槽移近。

  • 春季角膜炎一般几天好(春季角膜炎频发)

    角膜炎症必然使视力或多或少地受到影响,尤以炎症侵犯瞳孔区域者更为严重。角膜炎的发病症状一、外伤与感染角膜炎有哪些危害1、前房积脓严重病例多合并有虹膜睫状体炎。对各种原因引起的角膜上皮损伤或角膜溃疡,原则上禁用皮质类固醇,以免促使溃疡恶化,或延缓上皮损伤的愈合。角膜炎因角膜外伤,细菌及病毒侵入角膜引起的炎症。

  • 家居旺财的风水方法有哪些(家居旺财的风水方法介绍)

    家居旺财的风水方法有哪些门内是一处不可忽视旺财宝地,门口的玄关处是藏风聚气之地。厨房在风水中有财库说法,主掌内财运。因此,这些地方不能为空,要时时有食品;而且炉灶后方不宜空旷,以免影响财运。一般而言,在客厅大门对角45度位置,正是所谓的“明财位”。葫芦代表福禄,在财位摆放葫芦,旺财效果很显著;或悬挂一个葫芦,对提升财运也很有帮助。

  • 羊水少的原因(孕妇羊水少是什么原因引起的)

    胎儿畸形导致羊水少如果在孕早期或者中期发现羊水过少,则可能是因为宝宝有缺陷,导致不能产生足够的尿液来维持羊水循环。宝宝缺氧导致羊水少慢性缺氧会导致胎儿在子宫内发育迟缓,引起胎儿血液循环重分配,使血液主要供应脑和心脏,导致肾血流量下降,胎尿生成减少而致羊水过少。所以有人认为有些原因不明的羊水过少可能与羊膜本身病变有关。