当前位置: 首页 > news >正文

苏州产品推广公司厦门关键词seo

苏州产品推广公司,厦门关键词seo,长春火车站到吉大二院,金戈枸橼酸西地那非【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接 目录 【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接深入理解用户缓冲区缓冲区刷新问题缓冲区存在的意义 File模拟实现C语言中文件标准库 文件系统认识磁盘对目录的理解 软硬链接软硬链接的删除文件的三个时间 作者…【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接 目录 【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接深入理解用户缓冲区缓冲区刷新问题缓冲区存在的意义 File模拟实现C语言中文件标准库 文件系统认识磁盘对目录的理解 软硬链接软硬链接的删除文件的三个时间 作者爱写代码的刚子 时间2023.11.5 前言本篇博客将介绍缓冲区、磁盘的构成、分区以及文件系统中的结构、软硬链接 深入理解用户缓冲区 观察几个现象 正常现象一 现象二 现象三 图示 解释现象 对于现象二C语言文件操作函数中的字符串不带有’\n’即数据还停留在C语言的缓冲区中并未刷新和调用write()函数将数据刷新到内核系统文件的缓冲区中而write()函数由于是系统调用函数能正常执行但是由于close()函数将显示器文件关闭了即使进程结束也不能将数据从缓冲区刷新到显示器中。(如果将close函数屏蔽将会将C语言缓冲区中的数据刷新到显示器) 对于现象三(1)在程序未进行重定向之前默认是将数据写入显示器中当遇到’\n’时将数据从C语言的缓冲区中刷新到内核文件系统的缓冲区fork()并不影响原本程序的运行。(2)在程序进行重定向之后数据从向显示器写入变为了向文件中写入缓冲区从行缓冲变为了全缓冲所以此时的’\n’并不起作用所以数据依然存储在C语言的缓冲区中fork()函数创建子进程时子进程会将父进程的C语言缓冲区进行拷贝当父子进程结束后将缓冲区里面的内容全部刷新输出到显示器中。 显示器的文件的刷新方案是行刷新所以在printf执行完就会在遇到’\n’的时候会立即进行刷新用户刷新的本质就是将数据通过1write写入到内核中。目前我们认为只要将数据刷新到了内核数据就可以到硬件了。 缓冲区刷新问题 无缓冲 ——直接刷新行缓冲——不刷新碰到’\n’刷新显示器全缓冲——缓冲区满了才刷新普通文件的写入进程退出的时候也会刷新缓冲区 缓冲区存在的意义 解决效率问题配合格式化(printf中需要将%d等符号进行替换) File FILE里面含有对应打开文件等缓冲区字段和维护信息同时FILE对象属于用户这个缓冲区属于用户级缓冲区语言属于用户层 模拟实现C语言中文件标准库 Mystdio.h文件 #ifndef __MYSTDIO_H__ #define __MYSTDIO_H__ //open头文件 #include sys/types.h #include sys/stat.h #include fcntl.h // #include unistd.h // #include string.h #include stdlib.h#define FILE_MODE 0666 #define SIZE 1024#define FLUSH_NOW 1//0001 #define FLUSH_LINE 2//0010 #define FLUSH_ALL 4//0100typedef struct IO_FILE{int fileno;int flag;char inbuffer[SIZE];int in_pos;char outbuffer[SIZE];int out_pos;//缓冲区的有效字符和无效字符分界 }_FILE;_FILE* _fopen(const char* filename,const char* flag); int _fwrite(_FILE *fp,const char*s,int len); void _fclose(_FILE *fp);#endifMystdio.c文件 #include Mystdio.h_FILE* _fopen(const char* filename,const char* flag) {int f0;int fd-1;if(strcmp(flag,w)0){fO_CREAT|O_WRONLY|O_TRUNC;fd open(filename,f,FILE_MODE);}else if(strcmp(flag,r)0){fO_CREAT|O_RDONLY|O_TRUNC;fd open(filename,f,FILE_MODE);}else if(strcmp(flag,a)0){fO_APPEND;fd open(filename,f);}else{return NULL;}if(fd-1) return NULL;//创建文件结构对象_FILE* fp(_FILE*)malloc(sizeof(_FILE));if(fpNULL)return NULL;fp-fileno fd;fp-flag FLUSH_LINE;fp-out_pos0;return fp; } int _fwrite(_FILE *fp,const char*s,int len) {memcpy(fp-outbuffer[fp-out_pos],s,len);//这里省略了异常处理fp-out_poslen;if(fp-flag FLUSH_NOW){write(fp-fileno,fp-outbuffer,fp-out_pos);fp-out_pos0;}else if(fp-flag FLUSH_LINE){if(fp-outbuffer[fp-out_pos-1]\n)//\n可能出现在字符中间这时候需要对字符串做裁剪{write(fp-fileno,fp-outbuffer,fp-out_pos);fp-out_pos0;}}else if(fp-flag FLUSH_ALL){if(fp-out_posSIZE){write(fp-fileno,fp-outbuffer,fp-out_pos);//全写出去fp-out_pos0;}}return len;//成功写入的长度 } void _fflush(_FILE *fp) {if(fp-out_pos0){write(fp-fileno,fp-outbuffer,fp-out_pos);fp-out_pos0;} } void _fclose(_FILE *fp) {if(fpNULL)return ;_fflush(fp);close(fp-fileno);free(fp); }Main.c文件 #include Mystdio.h#define myfile test.txt int main() {_FILE* fp_fopen(myfile,w);if(fpNULL){return 1;}int cnt 10;while(cnt--){const char* msage hello Linux\n;_fwrite(fp,msage,strlen(msage));sleep(1);}//_fflush(fp)return 0; } 测试 makefile文件 while :;do cat test.txt;sleep 1;echo “----------------------”;done持续打印文件内容 一般C库函数写入文件时是全缓冲的而写入显示器是行缓冲。 printf fwrite 库函数会自带缓冲区(进度条例子就可以说明)当发生重定向到普通文件时数据的缓冲方式由行缓冲变成了全缓冲。而我们放在缓冲区中的数据就不会被立即刷新甚至fork之后 但是进程退出之后会统一刷新写入文件当中。 但是fork的时候父子数据会发生写时拷贝所以当你父进程准备刷新的时候子进程也就有了同样的 一份数据随即产生两份数据。write没有变化说明没有所谓的缓冲。 printf fwrite 库函数会自带缓冲区(用户级缓冲区)而 write系统调用没有带缓冲区。(为了提升整机性能OS也会提供相关内核级缓冲区) 文件系统 认识磁盘 磁头是一面一个磁头和盘面不接触磁头臂会进行摆动来定位柱面或磁道磁臂运动越少效率越高反之越低所以在软件设计上一定要有意识将相关数据放在一起 磁盘的逻辑结构是线性的对磁盘理解和建模 扇区的一般大小是512字节或者4kb 不仅CPU有寄存器其他设备外设也存在寄存器 对磁盘进行分区 关于inode中的block数组 inode中有struct inode结构体里面包括了文件所有的属性和一个blocks[15]数组其中的下标[0, 11]直接保存的就是该文件对应的blocks编号下标[12, 15]指向一个datablock但是这个datablock不保存有效数据而保存文件所适用的其它块的编号。相当于一个二级索引 stat 文件名查看文件的具体信息 ls -lia查看所有文件的信息包括文件的inode ls -i查看当前目录下各文件的inode编号 启动块的大小是确定的而块组的大小是由格式化的时候确定的并且不可以更改。 文件 内容 属性二者都是数据都要存储。Linux采用的是将内容和属性数据分开存储的方案内容在block中4KB内容是可以无限增多的。属性数据在inode中128字节文件的属性是稳定的。 注意一个要点inode可能会存在用完的情况 Linux系统中一个文件一个inode每一个inode。每一个inode都有自己的inode编号inode的设置是以分区为单位的不能跨分区 对目录的理解 Linux下一切皆文件目录也是一个文件通过文件名对应的inode编号- 找到自己所处的目录 - 根据目录的inode找到目录的data block - 将文件名和inode编号的映射关系写入到目录的数据块中。 问题1:为什么同一个目录下不能存在同名文件 因为一个文件只存在一个inode文件名是作为key值去找inode的如果存在同名文件就会破坏对应的映射关系。 问题2:为什么没有w权限就不能创建文件 即便是能创建文件也不能将该文件与inode的映射关系写到数据块中。 问题3:为什么没有r权限就不能查看文件 无法拿到该目录文件中文件与inode之间的映射关系 问题4:为什么没有x权限就不能进入目录 不让用户更改环境变量中的目录信息 查找任何一个文件时我们必须从当前目录递归到根目录然后从根目录信息中查找对应子目录的inode信息效率会低 所以Linux中会存在提升效率的方法将常用的路径信息进行缓存dentry缓存里面的结构算法较复杂 软硬链接 建立软链接 软链接的inode不同 软连接又叫符号链接软连接文件相当于源文件来说是一个独立的文件该文件有自己的inode号但是该文件只包含了源文件的路径名所以软连接文件的大小要比源文件小得多。软连接就类似于Windows操作系统当中的快捷方式。软链接保存的是对应文件的所在路径 ln -s 对应的路径 软链接的名字添加快捷方式 建立硬链接 硬链接的inode相同同时文件的引用计数变为了2 硬连接数本质就是该文件inode属性中的计数器count标识有几个文件名和我的inode建立了映射关系。简言之就是有几个文件名指向我的inode文件本身硬链接就是让多个不在或者同在一个目录下的文件名同时能够修改同一个文件其中一个修改后所有与其有硬链接的文件都一起修改了。 为什么文件被创建出来默认的硬连接数是1 如果硬链接数是0那么就应该是被关闭的文件了所以至少应该从1开始。此外普通文件的文件名本身就和自己的inode具有映射关系且只有1个所以文件的默认硬连接数是1。 创建一个新目录时引用计数默认为2 我们也可以根据系统的硬连接数不进入文件从而估算出文件的目录数一个目录下相邻的子目录数 该目录的硬连接数 - 2。因此硬链接的一个作用就是进行路径切换。 软硬链接的删除 unlinkunlink也可以删除普通文件与rm没什么区别 文件的三个时间 这其中包含了文件的三个时间信息 Access 文件最后被访问的时间。Modify 文件内容最后的修改时间。Change 文件属性最后的修改时间。 当我们修改文件内容时文件的大小一般会随之改变所以Modify的改变会带动Change一起改变但对该文件属性一般不会影响文件内容所以一般情况下Change的改变不会带动Modify的改变。此外我们可以使用touch命令把这三个时间都更新到最新状态。当一文件存在时使用touch命令此时touch命令的作用变为更新文件信息。
http://www.zqtcl.cn/news/716117/

相关文章:

  • 建设内网网站流程凡客诚品现在还有吗
  • 西安网站公司免费云手机无限时间版
  • 网站建设与管理案例教程ipad可以做网站吗
  • 济南网站建设模板python网站开发用什么软件
  • 北京品牌网站建设阿里巴巴logo图片
  • 做宣传册从哪个网站找素材中文在线っと好きだっ
  • 国际物流东莞网站建设wap是什么意思的缩写
  • 传奇官网百度seo营销网站
  • 如何在导航网站上做链接上海建筑设计研究院
  • 微信营销软件网站建设推广链接
  • 美的集团网站建设方案书广汉做网站
  • 个人博客网站实验报告商标购买网站
  • 2020给个免费网站好人有好报做购物微信网站
  • 做淘宝客网站挣钱济南百度竞价代运营
  • 国外网站404错误页网站地址搜索
  • 做 暧视频在线观看网站北京安卓app开发公司
  • h5哪个网站可以做惠州+企业网站建设
  • 网站运营知识哪个网站可以做免费商业推广
  • 电脑做网站怎么解析域名河南郑州静默管理
  • 项目网站制作冯提莫斗鱼前在哪个网站做直播
  • 网站建设 思路wordpress 访问记录插件
  • 网站建设diyseo课程培训班费用
  • 舞蹈培训东莞网站建设做直播网站
  • app建设网站公司网站制作预算
  • 移动端网站如何开发市辖区郑州网站建设
  • 山东省双体系建设网站wordpress 帮助 主题
  • 手机怎么做三个视频网站网站建设协议一百互联
  • 创建一个网站一般步骤有哪些安徽软件定制开发
  • 网站建设平台协议书模板下载佳木斯建网站的
  • 部队网站建设招标二级域名注册平台