论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
主机系统
›
linux
›
文件与历程
文件与历程
杀鸡焉用牛刀
论坛元老
|
2024-9-21 20:44:58
|
来自手机
|
显示全部楼层
|
阅读模式
楼主
主题
2039
|
帖子
2039
|
积分
6117
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
明确文件:
操作文件的本质是历程在操作文件!这是历程和文件的关系!
如何明确文件?
文件在未打开之前是存在磁盘中的,而磁盘是在外设上的,也就是硬件上的,所以向文件中写入,本质上就是在朝硬件中写入,但是用户并没有权力直接在硬件上进行写入操作,所以必须通过操作体系进行写入,所以使用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企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
杀鸡焉用牛刀
论坛元老
这个人很懒什么都没写!
楼主热帖
ElasticSearch-高级查询
手把手带你通过API创建一个loT边缘应用 ...
一、kotlin基础语法学习
第4章 复合类型
背八股文的都是什么水平
揭秘 ChunJun:如何实现 e2e&session ...
生产事故-记一次特殊的OOM排查 ...
Apache Hudi 在袋鼠云数据湖平台的设计 ...
开源轻量级工作流WorkflowCore介绍 ...
源码解析 Handler 面试宝典
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
人工智能
快速回复
返回顶部
返回列表