共享操作文件,同一进程共享相同的文件,多个进程(程序)共享操作同一个文件(文件IO)【linux】(g)

同一进程共享相同的文件

同一进程(程序),多次open同一个文件
程序演示:
我们通过循环写数据:
在这里插入图片描述
在这里插入图片描述

因为我们给出的是死循环所以程序执行一段事件之后我们自行关闭程序进行文件内容查看。
执行过程为:
在这里插入图片描述

我们可以看到程序执行完整之后前面写的hello都被world给覆盖了。

在这里插入图片描述

在同一个进程中多次open打开同一文件时,文件描述符不可能会相同在同一进程里面,一旦某个文件描述符被用了,在close释放之前,别人不可能使用,所以指向同一文件的描述符不可能相同。

我们通过代码进行说明:
在这里插入图片描述
在这里插入图片描述

执行结果为:
在这里插入图片描述

我们可以看到两个文件描述符是不同的。

在写数据时,为什么会相互的覆盖?

进程表和文件描述符表的关系

在这里插入图片描述

由图知道,正是由于不同的文件描述符,各自对应一个独立的文件表,在文件表中有属于自己的“文件位移量”,开始时都是0。各自从0开始写,每写一个字节向后移动一个字节,他们写的位置是重叠的,因此肯定会相互的覆盖。读者可以通过代码和结果理解覆盖的的过程。

我们可以指定O_APPEND解决
必须每个open都要指定,有一个不指定就会覆盖,
就像过马路一样,都要准守交通规则才能安全,开车的和行人,只要有一个不准守都会出事。

文件长度信息时大家共享的,当文件被写入数据后,文件长度就会被更新,都指定O_APPEND后,使用不同的文件,描述符写数据时,都会使用文件长度更新自己的文件位移量,保证每次都是在文件的最末尾写数据,就不会出现相互覆盖的情况。

我们通过代码演示:
在这里插入图片描述
在这里插入图片描述

执行过程为:
在这里插入图片描述

执行结果为:
在这里插入图片描述

最前面的换行是前面打印文件描述符的换行。

多个进程(程序)共享操作同一个文件

程序演示
在这里插入图片描述

我们创建两个文件别写代码操作一个文件。
代码分别为:
share_file1.c
在这里插入图片描述
在这里插入图片描述

share_file2.c
在这里插入图片描述
在这里插入图片描述我们先运行写入hello 的程序:
在这里插入图片描述

我们可以看到两个文件描述符相同。
运行结果为:
在这里插入图片描述

我们可以看到中间内容world把hello覆盖了,后面出现hello是因为刚才手动关闭hello比较晚。那如果把运行顺序反过来,结果了就会反过来。

不同进程打开同一文件时,各自使用的文件描述符值可能相等,比如我们例子中的1和2进程,它们open后的描述符就相等。之所以相同,是因为不同的进程有自己独立的文件描述符池,都是0~1023的范围,各自分配自己的,有可能分派到相等值的文件描述符。就相当于你有你的一栋楼,我有我的一栋楼,你的楼上有101房间,我的可能也有我的101房间,都是101房间,但是是不相同的。这里需要注意。

进程表和文件描述符表的关系

在这里插入图片描述

V节点相同说明共享的是同一个文件,在文件共享的当中,V节点必然相同,代表共享操作的是同一个文件。

覆盖的原因也是因为因为各自有独立的文件位移量。
同样的,指定O_APPEND标志,写操作时,使用文件长度去更新文件位移量,保证各自操作时,都在文件的尾部操作,就不会出现相互覆盖的情况。
代码演示:

share_file1
在这里插入图片描述
在这里插入图片描述

share_file2
在这里插入图片描述
在这里插入图片描述

我们分别编译两份代码:
在这里插入图片描述
分别在不同给终端同时执行:
在这里插入图片描述

执行结果为:
在这里插入图片描述

我们可以看到hello world 交替打印,没有覆盖。

小结

在同一个进程里面打开多个文件和在不同的进程里面原理一文件的原理是一样的,读者可以通过进程表进行查看理解。

发布了84 篇原创文章 · 获赞 71 · 访问量 9113

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104151401