ToB企服应用市场:ToB评测及商务社交产业平台
标题:
文件与历程
[打印本页]
作者:
杀鸡焉用牛刀
时间:
2024-9-21 20:44
标题:
文件与历程
明确文件:
操作文件的本质是历程在操作文件!这是历程和文件的关系!
如何明确文件?
文件在未打开之前是存在磁盘中的,而磁盘是在外设上的,也就是硬件上的,所以向文件中写入,本质上就是在朝硬件中写入,但是用户并没有权力直接在硬件上进行写入操作,所以必须通过操作体系进行写入,所以使用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语言的方法。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4