文件与进程
创始人
2024-09-25 18:24:28
0

理解文件:

操作文件的本质是进程在操作文件!这是进程和文件的关系!

如何理解文件?

文件在未打开之前是存在磁盘中的,而磁盘是在外设上的,也就是硬件上的,所以向文件中写入,本质上就是在朝硬件中写入,但是用户并没有权力直接在硬件上进行写入操作,所以必须通过操作系统进行写入,所以使用fopen、fwr、fprintf等等,其实本质上都是一个操作系统的调用函数,是C语言库对操作系统提供的系统调用函数的一种封装,同时C/C++等其他语言访问文件的方式有些不一样!

文件操作:

open:打开文件

  • 第一个参数是文件名或者文件路径,只有文件名则是表示打开的文件在当前的路劲下
  • 第二个参数是表示这么创建这个文件,表示一个整数,能使用很多标记为

标记位的使用:

标记位是 以写方式打开,如果没有则创建,如果fd获取的标记为是小于0则表示文件打开失败!

创建了这个文件,而这个文件创建出来的权限不对劲!在Linux中,如果创建文件,就要设置这个文件的初始权限,所以这就需要第三个参数来赋予文件的权限!同时权限也是一个整数

0666表示的就是一个文件的读写权限

不过为什么这个文件的权限是664而我们赋予的是666,这是系统中存在的一个权限掩码,这是系统将权限掩码和我们赋予的权限进行了位运算,这个权限掩码是可以进行更改的!

使用umask函数将权限掩码变成0,这样就可以把文件的权限设置成我们想要的权限了!注意权限掩码默认是002为什么open的第二个参数是整数,那为什么我们写的全是字符?

一个整数是由32位比特位写的 ,所以使用比特位来进行标志位的传递,这是操作系统对很多系统调用接口的一种常见方式!而我们在第二个参数上写的字符,其实是以比特位来设计的一种宏!

 关闭文件:
 

 

写入文件:

 

文件描述符 fd:

是以上文件函数的 第一个参数 ,同时也是打开文件失败的返回值!并不是从0、1、2开始进行返回值的,而是从3开始,而0、1、2分别是标准输入、标准输出、标准错误

0、1、2是系统开启后默认打开的,同样也可以被使用:

操作系统要为被打开的文件进行管理,所以每次打开一个文件 操作系统就会形成一个关于这个文件的内核数据结构struct file ,这个内核数据结构会拥有关于该文件的属性,例如文件的打开方式。

而对于文件的管理就是对struct file 的管理,而一群struct file 结构体 会进行双链表链接,同时每一个文件都会拥有操作系统为文件申请的一个内存,也就是文件按内核级的缓存区

所以最后,文件的属性是用来进行struct file 的初始化,而文件的内容则是存放在文件内核级缓存区中,每次的修改的内容都会在缓存区中存放,并由缓存区冲刷到文件所在的磁盘中进行修改,而读取文件内容则是文件将内容拷贝到缓存区中

所以无论读写都必须让操作系统把文件的内容读取到缓存区当中!所以对于文件的修改是内核级的,而不是磁盘级的

而对于打开文件的本质是打开进程,进程可以打开多个文件,所以进程对文件的关系是一对多,那进程如何找到它自己打开的文件呢

在进程task_strucrt 的属性中具有一个struct files_struct *file 的数据数据结构,正是使用了这个结构体,才让进程和文件建立了关系

struct files_struct *file 的内部存在一个数组,且是一个指针数组,这个指针数组内部的指针指向的就是文件,同时数组的0、1、2下标存储的是标准输入、标准输出、标准错误

同时文件的地址一一被struct files_struct *file内部的指针指向,并存放在了这个数组的内部,而这个数组的下标最终会被拿取,变成 文件描述符,所以fd的本质就是这个数组的下标,通过这个下标来获取文件的信息和内容 

open是在创建file 和开辟文件缓存区的空间,加载文件数据,进行查找进程的文件缓存区的表,把file的地址填入对应的表内,最后返回数组下标

 那为什么fd 0、1、2会默认打开?

因为0、1、2是硬件!而对于Linux中一切皆文件!所以硬件也是文件!

而对于一切皆文件如何理解?

对于每一个设备而言,都具有名字、类别、厂商、操作方法等属性

因此每一个操作系统都可以被一个结构体所描述:

同时每一个文件 的 struct file 内部都具有相对应的读写指针,而每一个硬件设备的驱动内都有读写操作方法实现,虽然每一个硬件设备的读写操作实现方法都是不一样的,但是可以设置成一样类型的,所以文件中的struct file内部的读写指针可以一一指向和对应硬件驱动上的读写操作方法!

而对与每一个被打开的文件来说,它的读、写指针是struct file 内部的一块新的属性,也是每一个被打开文件的操作底层!

所以,只需要看struct file 内部的读写指针指向那个硬件的读写方法,就表示这个文件访问了这个硬件!所以这就是一切皆文件!在操作系统内部,系统在访问文件的时候只认文件描述符fd!

而对于C语言C++的文件操控函数,例如fopen、fcolose等 为什么需要使用FLIE作为类型指针,这是因为FILE是一个C语言提供的结构体,而在这个结构体的内部一定是要封装fd 的! 所以所有C语言上的文件操作函数,本质底层都是系统调用的封装!

C语言为什么要这样做?

C语言可以使用系统调用,也可也使用语言层面上提供的文件方法,这主要是因为操作系统的不同,系统调用的函数可能不一样,而C语言是一个能够跨平台的语言,所以可以直接使用C语言的方法。

相关内容

热门资讯

安卓系统为什么不封闭,揭秘安卓... 你有没有想过,为什么安卓系统那么开放,却不像苹果iOS那样封闭呢?这背后可是有着不少有趣的故事和原因...
安卓系统更新包多大,解析不同版... 你有没有发现,每次安卓系统更新,手机里都会多出那么几个G的文件?这可真是让人好奇,安卓系统更新包究竟...
安卓手机安装双系统吗,安卓手机... 你有没有想过,你的安卓手机是不是也能像电脑一样,装上两个系统,一个用来工作,一个用来娱乐?没错,这就...
oppo会升级安卓系统,畅享最... 你知道吗?最近有个大消息在手机圈里炸开了锅,那就是OPPO要升级安卓系统啦!这可不是什么小打小闹的更...
安卓系统上安装windows,... 你有没有想过,在安卓手机上安装Windows系统?听起来是不是有点不可思议?但你知道吗,这竟然是可能...
安卓系统怎么进运行框,安卓系统... 你有没有想过,你的安卓手机里有一个超级实用的功能,那就是运行框!它就像是一个小助手,帮你快速找到正在...
安卓系统电视无图像设置,安卓电... 你家的安卓系统电视突然没图像了?别急,让我来给你支个招,让你轻松解决这个问题!一、检查电源和连接线首...
安卓机建议升级系统吗,提升性能 你有没有发现,你的安卓手机最近有点儿慢吞吞的?是不是在犹豫要不要升级系统呢?别急,让我来给你好好分析...
升级不了安卓系统升级,探寻升级... 你有没有遇到过这种情况?手机里的安卓系统突然告诉你,它需要升级,但你左等右等,就是升不上去。这可真是...
备用安卓系统手机推荐,盘点热门... 你有没有想过,如果你的手机突然罢工了,你会怎么办?别担心,今天我就要给你安利几款备用安卓系统手机,让...
旧安卓系统ipad无法更新系统... 你有没有遇到过这种情况?你的旧安卓系统iPad突然告诉你,它无法更新系统了!是不是瞬间感觉心里有点小...
运行安卓6系统命令大全,全面掌... 你有没有想过,你的安卓手机里隐藏着无数强大的功能,只等着你去发现和探索呢?今天,就让我带你走进安卓6...
安卓系统简笔画教程下载,轻松绘... 你有没有想过,用简单的线条就能把复杂的安卓系统画出来?没错,就是那种一看就懂,一画就上手的感觉!今天...
华为如何鸿蒙转安卓系统,轻松实... 你知道吗?最近华为的大动作可是让整个科技圈都沸腾了!他们竟然把鸿蒙系统转到了安卓系统上,这可真是让人...
安卓10系统的问题,安卓10系... 你有没有发现,自从你的手机升级到安卓10系统后,好像有点不对劲呢?别急,让我来给你细细道来,看看安卓...
安卓系统苹果搞笑视频,苹果搞笑... 你知道吗?在互联网的世界里,搞笑视频可是个永恒的热门话题。尤其是那些结合了安卓系统和苹果手机的搞笑片...
卡片机改造安卓系统,探索改造之... 你有没有想过,那些曾经陪伴我们记录美好时光的卡片机,现在竟然也能焕发第二春呢?没错,就是那些小巧便携...
装安卓系统倒车出不来,智能科技... 你有没有遇到过这样的事情:手机装了个安卓系统,结果倒车的时候出不来啦?这可不是闹着玩的,简直让人抓狂...
定制安卓系统哪家好点儿,哪家服... 你有没有想过,手机系统就像是个人的衣服,每个人都需要找到最适合自己的那一款?今天,咱们就来聊聊定制安...
台电用回安卓系统吗,开启智能新... 最近有个话题在科技圈里炒得挺热的,那就是台电是不是要用回安卓系统了?你有没有想过,这个小小的决定背后...