Linux下文件描述符剖析

Linux文件IO open、dup、fork内核原理分析

1、open一个文件

一个Linux进程启动后,会在内核空间创建一个PCB进程控制块,PCB是一个进程的私有财产。

这个PCB中有一个已打开文件描述符表,记录着所有该进程打开的文件描述符以及对应的file结构体地址。

默认情况下,启动一个Linux进程后,会打开三个文件,分别是标准输入、标准输出、标准错误分别使用了0、1 、2号文件描述符。

当该进程使用函数open打开一个新的文件时,一般会在内核空间申请一个file结构体,并且把3号文件描述符对应的file指针指向file结构体。

代码如下:

testOpen.c

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
  
  
    int fd = open("./log.txt", O_RDWR);
    printf("new fd = %d\n", fd);
}

原理图如下:

process table entry就是进程的文件描述符表,file table entry用来记录文件的读写打开模式,当前文件偏移量,以及v-node指针。

v-node table entry是虚拟文件系统对应的文件节点,i-node是磁盘文件系统对应的文件节点。通过这两个节点就能找到最终的磁盘文件。

每一个进程只有一个process table entry,一般情况下默认使用 fd 0、fd1、fd2,新打开的文件log.txt将使用

fd 3。

2、两个进程同时open一个文件

两个进程同时open一个文件,这个时候的原理图如下:


因为现在是两个进程,所以process table entry进程控制块也是两个,每个进程控制块中各自维护一个张文件描述符表,同时打开一个文件的时候,都各自申请了一个file table entry。

        由于打开的是同一一个文件,所以file table entry都指向了同一个v-node。

两个file table entry,怎么去证明呢?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值