缓冲区大小不同_inode、文件描述符与文件指针的差异

inode和文件描述符、文件指针差异

在linux中,内核通过inode来找到每个文件,但一个文件可以被许多用户同时打开或一个用户同时打开多次。这就有一个问题,如何管理文件的当前位移量,因为可能每个用户打开文件后进行的操作都不一样,这样文件位移量也不同,当然还有其他的一些问题。所以linux又搞了一个文件描述符(file descriptor)这个东西,来分别为每一个用户服务。每个用户每次打开一个文件,就产生一个文件描述符,多次打开就产生多个文件描述符,一一对应,不管是同一个用户,还是多个用户。该文件描述符就记录了当前打开的文件的偏移量等数据。所以一个i节点可以有0个或多个文件描述符。多个文件描述符可以对应一个inode。

总结:

  • Linux通过inode来查找每个文件。
  • 每打开一个文件,对应一个fd,通过fd可以查找到打开的文件的偏移量等数据。

文件描述符、文件指针、inode

Linux中一切皆文件,设备也不例外,有标准输入设备文件,标准输出设备文件等。如下图所示。

 

2227559f8e5d9015cde035e6d96ba2e0.png

从图中可知,内核会在每个进程空间PCB(Process Control Block,进程控制块)中维护一个文件描述符表,所有打开的文件都将通过此表中的文件描述符来引用。其中文件描述符就是这个文件描述符表的下标,每个表项都有一个指向已打开文件的指针。从图中可以看出程序运行起来之后都会默认的打开三个流:

  • 标准输入流(stdin:键盘)。
  • 标准输出流(stdout:显示器)。
  • 标准错误流(stderr:显示器)。

实际上,任何程序运行都会打开标准输入、标准输出和标准错误。

打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

文件指针指向进程用户区中的一个被称为FILE结构的数据结构。

FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

FILE结构体如下所示。

 
  1. struct FILE

  2. {

  3. char *_ptr;//文件输入的下一个位置

  4. int _cnt;//当前缓冲区的相对位置

  5. char *_base;//指基础位置(文件的起始位置)

  6. int _flag;//文件标志

  7. int _file;//文件的有效性验证

  8. int _charbuf;//检查缓冲区状况,如果缓冲区则不读取

  9. int _bufsiz;//文件的大小

  10. char *_tmpfname;//临时文件名

  11. };

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值