【Linux】文件管理系统解析(I/O与缓冲区,文件描述符fd,iNode)

0.前言

操作系统是管理资源的,想管理,要先描述,再组织管理

这篇文章前四点着重介绍文件操作使用。
第五点着重介绍文件管理系统是如何做到高效稳定的管理的。

1.文件

1.1如何理解文件?

“Linux下一切皆文件”

1.1 文件构成

首先明确一点,文件的构成,用Windows举例,
文件=内容+属性。
内容:就是里面存储的数据了。
属性:关于这个文件的特征,比如大小,创建时间,修改时间,存储位置等

1.2 文件有哪些

文件其实不止于,.txt .c .cpp .exe 等等。

是不是文件主要看他有没有iNode,这个概念下面提到。

说几个容易被忽略的文件,

显示器(stdout),键盘(stdin),错误码(stderror)。

目录也是文件,软连接也是文件,硬链接不是。

至于里面存储的是什么,且听下面的解释。

2.文件操作

2.1 C语言文件操作

fopen、fwrite、fread、rewind、fseek、fclose。

每个函数都在cpp官网可以找到使用方法和示例,不再赘述。

列出几个本人踩过的坑:

  1. 注意返回值类型size_t,要匹配。
  2. 读写操作要注意数据类型的大小
  3. 文件内部也需要定位,好比电脑光标一样,
  4. rewind是回退到开始位置,
  5. fseek函数可以指定位置,但是要注意fseek函数的第二个参数偏移量,这个参数指定文件的初始位置。
  6. ftell函数可以告诉你当前打开文件的指向位置。
    Linux下示例:

代码截图:
在这里插入图片描述
运行截图
在这里插入图片描述

2.2 系统调用文件操作

open、write、lseek、read、close。

使用方法类比C语言文件操作库函数接口
open接口介绍:
在这里插入图片描述
第一个参数:代表文件名.

第二个参数:代表打开方式,

为什么是int类型,而且可以有多种方式呢?

注意联系两种打开方法中间的操作符就是按位或 “| ” ,每一种方式对应32个比特位上的某位为1。根据一个int参数的比特位来确定打开方式。
在这里插入图片描述
第三个参数:需要创建文件时,设定的文件权限。

注意:并不是你设置了多少就是多少,要考虑与系统给出的umask掩码计算后的结果。
假设你给出的权限是mask,则实际创建的出来的文件权限是:
mask & ~umask
格式: umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。

write接口介绍:
在这里插入图片描述

代码截图:
在这里插入图片描述
运行截图:
在这里插入图片描述

2.3 两种操作的关系

其实看名字思考一下就能明白,一个是C语言库函数给出的接口,一个是操作系统给出的接口,而操作系统是设备软硬件资源的直接管理者。

所以,可以认为,f#系列的函数,都是对系统调用的封装调用,方便二次开发。

再来看一个现象,验证一下,
在这里插入图片描述
背景:
open函数的返回值是个整数,这个整数是一个文件指针数组的下标,而操作系统默认打开三个标准文件,标准输入,标准输出,标准错误。分别占用这个文件指针数组的0、1、2。这个下标就是我们下面要讲的文件描述符fd。

现象:
原本应该printf标准输出的fp:1到显示器上,在关闭显示器这个文件后后,重新打开的文件占用了最小的未使用的文件指针数组里的位置。(重定向的一个例子)

原因:
而printf是C语言文件函数接口,它调用了一个系统调用接口write

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值