95-探究Linux下父子进程是否共享文件

父进程先打开一个文件,fork 后子进程是否可以共享使用?

在这里插入图片描述
每个进程都有一个PCB,在PCB中,有一个文件表, 有下标,0,1,2,3,4
文件描述符就是这个文件表的下标。
默认情况下,进程运行起来,有标准输入,标准输出,标准错误输出,我们再打开一个文件,文件描述符的值就是3,以此类推下去。
如果我们close(3),这个3就会空闲出来,下一次再打开文件,文件描述符就还是3。
我们每次打开文件,使用的文件描述符的值就是当前下标中未使用的最小的那个值。
我们每次打开文件以后,会产生struct file这样一个结构体在内核中,用来表示打开的这个文件,记录着文件偏移量(起始从0开始,随着写入数据进行偏移),引用计数(几个进程都在使用这个打开的文件),inode节点(存放进程的属性信息:谁创建了,名字是什么,在磁盘哪里存储。通过这个inode节点,我们才能找到对应的这个具体的文件),我们用open打开一个文件,这一串操作就建立连起来了。
struct file还包含了打开方式:只读方式,只写方式打开

首先书写头文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行后如下图
在这里插入图片描述
由于 fork 创建的子进程的 PCB 是拷贝父进程的,子进程的 PCB 中的文件表指向打开文件的指针只是拷贝了父进程 PCB 中的值(浅拷贝),所以父子进程会共享父进程 fork 之前打开的所有文件描述符,引用计数变为2
在这里插入图片描述
父进程去读,文件偏移量+1,然后子进程去读,就从当前的文件偏移量继续往下读了,父子进程是共享偏移量的。
在这里插入图片描述

因为引用计数是2,所以父子进程都执行close,才算彻底关闭文件。父进程执行close,子进程依旧可以访问文件。子进程执行close,父进程依旧可以访问文件。

如果先执行fork 再打开文件来读取
在这里插入图片描述
现在就是父子进程是各自打开各自的文件。
那么执行结果是
在这里插入图片描述
原因如下所示示意图
在这里插入图片描述

父子进程不共享文件偏移量

代码演示2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
父子进程并发运行
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值