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

中国建设教育协会是个什么网站七台河做网站

中国建设教育协会是个什么网站,七台河做网站,wordpress可以换模板吗,百度云引擎搜索引言#xff1a; 北京时间#xff1a;2023/3/25#xff0c;昨天摆烂一天#xff0c;今天再次坐牢7小时#xff0c;难受尽在不言中#xff0c;并且对于笔试题#xff0c;还是非常的困难#xff0c;可能是我做题不够多#xff0c;也可能是没有好好的总结之前做过的一些…引言 北京时间2023/3/25昨天摆烂一天今天再次坐牢7小时难受尽在不言中并且对于笔试题还是非常的困难可能是我做题不够多也可能是没有好好的总结之前做过的一些题目反正就是摆烂而且刚刚看了一下蓝桥杯的题目头大虽然我5个月前就意识到了并且5个月前相信我自己也许现在看到这种题目的时候不会头大没想到啊往日依旧啊一点进步没有哈哈哈所以从明天开始我们开始整理做过的一些题目争取掌握一些的做题技巧所以今天我们就开始学学什么是基础IO和文件描述符并且承接上篇博客的有关文件操作的知识 复习文件操作 从语言层面看文件操作 具体请看该链接博客该博客是我之前学习C语言时总结的有关C语言文件操作C语言文件操作详解想要了解C语言也就是语言层面的文件操作就看上述链接就行我们把重点放在我们的系统层面文件操作Linux操作系统 从系统层面看文件操作 首先第一个接口肯定是如何打开文件的接口就让我们一起看看Linux系统中的打开文件接口 open 吧头文件 #include sys/types.h 、 #include sys/stat.h 和 #include fcntl.h 具体使用方式 int open(const char *pathname, int flags); 并且此时发现该打开文件接口的返回值是一个int类型并且此时open接口的第二个函数是一个int flags;的参数第一个参数我们很好理解代表的就是我们要打开的文件名那这第二个参数代表的是什么意思呢 想要知道第二个参数flags代表的是什么意思此时我们就可以通过语言层面来推测如我们知道在C语言中打开文件的使用方式是使用文件名和该文件的打开方式w、r来实现的如下FILE* fopen(const char* filenameconst char* mode)并且发现返回值是一个FILE*, fopen返回值类型的文件指针所以我们可以间接的理解系统接口open的第二个参数代表也是文件的打开方式那么此时我们就会好奇为什么可以使用一个整形来表示文件的打开方式呢 所以此时为了搞定这个问题我们就可以引出一个新的问题搞懂这个问题我们就搞懂了上述的问题就是操作系统(OS)一般是如何让用户给自己传递标志位 标志位相关知识理解 例如我们想要给一个函数传递好几个标志位参数int function(int flag1,int flag2,int flag3,……);我们一般使用的肯定是如上的方法定义非常多个变量来进行多个标志位的传递但是如果标志位有非常多呢所以此时操作系统就做了一个处理使用定义宏的方式使用位图结构来解决传递多个标志位的问题并且位图就是使用一个比特位来表示一个标志位一个int就可以同时至少传递32个标志位所以本质就是位图的0/1结构可以代表非常多不同的值从而通过这些不同的值操作系统就可以识别出到底传了多少个标志位和这些标志位分别是什么如下图所示 所以此时我们就可以通过二进制标志位的方式来进行参数的传递本质就是通过定义各种宏代表相应的二进制标志位的值然后通过按位与的方式来限制这些宏执行的条件并且通过按位或|的方式来表示同时可以执行的行为所以此时我们就可以通过传递宏的方式来获取我们想要让代码执行的行为 如下图 所以明白了上述的有关标志位的知识此时我们就可以很好的理解为什么系统调用接口open的第二个参数是一个整形参数并且返回值也是一个整形了就是因为操作系统在设计接口的时候是通过标志位的形式来封装各种的有关文件读写权限例如上述的1可以表示是读权限等只有我们传递给操作系统接口的值为1或者为定义1的这个宏此时我们才可以访问到系统调用中的文件打开的读权限上述的 if 语句判断和按位与就行前提所以如下图就是操作系统中有关文件打开权限的宏定义我们想要通过某种权限打开文件此时就需要通过这些宏进行传参本质就是标志位的传参如图就是系统中文件打开权限表示宏定义 总结未来我们封装一个函数就可以给这个函数设置不同的标志位并且将每一个标志位定义一个宏最后在函数内部对宏值做判断函数外部就可以通过宏的传递进行相应标志位代表的行为的调用这个也就是操作系统实现系统调用的一个常规设计思路 搞定了上述知识此时我们就可以正式的来看一看什么是系统层面的文件操作了但这边浅浅的再谈一句就是例如C语言中的‘w’‘r’‘a’权限本质都是通过对我们上述所说的对系统宏定义的标志位进行的再一次用户级封装而已所以我们此时就可以理解 int open(const char *pathname, int flags);打开文件接口中的第二个参数int flags表示的意思和用法了 并且明白只要打开文件就一定要关系文件所以在系统中关闭文件的接口close头文件#include unistd.h使用方法 int close(int fd); fd表示的意思就是打开文件后的那个返回值同理C语言中打开文件后的那个指向文件的指针如下代码就是一个文件创建并打开int fd open(LOG, O_WRONLY | O_CREAT);使用两个宏定义的方式来表示读取文件和创建文件但是如果此时按照上述写我们可以发现我们的LOG代表的文件的权限是乱码所以此时就涉及到了创建文件是需要权限的问题表示的意思就是我们创建一个文件一定需要给与这个文件相应的权限才可以如果没有给系统默认就是乱码此时就引出有关文件打开的另一个参数模板 int open(const char *pathname, int flags, mode_t mode);这个模板就可以很好的解决上述的问题可以让我们打开文件创建文件的同时赋予这个文件一定的权限具体使用如下int fd open(LOG, O_WRONLY | O_CREAT, 0666); 这里的0666表示的就是赋予这个文件读写执行的所有权限具体可以参照Linux权限那一节的相关知识可以直接使用二进制来修改权限Linux系统的权限问题本质就是因为100,010,001分别代表的是一个文件的读写执行权限所以默认一个文件的创建就是拥有读写权限所以我们添加的权限就是666权限一个6表示读写权限但是因为文件分为拥有者、所属组、other所以是666权限但是前提是不受umask影响所以需要把umask设置为0具体代码如下图 搞定了打开和关闭文件此时我们就来看一看如何写入、追加和读取文件中的数据写入数据头文件#include unistd.h使用方式 ssize_t write(int fd, const void *buf, size_t count);表示的意思将buf数组中的大小为count的数据写入到fd被打开文件中但是要注意如果只使用原来的文件打开方式在我们往文件中写入数据的时候此时就不可以像C语言文件操作一样文件内部会自己清空文件中的数据所以在我们如果想要让文件打开时自动将文件中的内容清空那么就需要在打开文件的时候多加一个宏定义的标志位如该代码int fd open(LOG,O_WRONLY | O_CREAT | O_TRUNC,0666);多加了一个标志位才可以让系统实现清理被打开文件的效果搞定了写入此时我们就来看看追加本质追加就是一种写入所以可以和上述的原理一样我们只要把文件的打开方式改动一下就可以了如该代码 int fd open(LOG, O_WRONLY | O_APPEND | O_CREAT,0666); 所以只需要在打开文件的时候加一个 O_APPEND 的宏定义标志位就行啦并且将自动清理标志位去掉因为自动清理标志位和追加标志位是矛盾的搞定了追加我们就再来看看什么是读取文件同理头文件 #include unistd.h基本使用方式ssize_t read(int fd, void *buf, size_t count);表示可以将一个fd被打开文件中的数据按照count大小读取到buffer数组中具体使用如该代码ssize_t n read(fd,buffer,sizeof(buffer)-1);减一的原因在于C语言文件操作和系统文件操作是不同的C语言文件操作需要以\0结尾但系统文件操作没有这个规定并且还要注意的是文件的打开方式需要发生改变 int fd open(LOG,O_RDONLY)需要以读的方式来打开并且因为读取文件已经存在所以不需要给给权限使用普通的系统文件打开接口就行 所以部分的文件打开方式如下 本质就是可以通过宏定义的标志位来实现不同的行为并且要注意文件打开方式不同相应的读取、写入、追加效果都是不同的所以注意要匹配使用 总还是那句话任何语言中的文件操作无论是读写还是追加等都是像上述一样通过封装各种的宏定义标志位实现也就是通过封装各种的系统调用接口实现而已 所以文件操作的本质都是被打开文件和进程之间的关系我们学习的目标也就是进程和被打开文件之间的关系所以按照内存来看就是struct task_struct;和struct file;之间的关系也就是进程控制块和文件对象之间的关系所以无论是什么语言都不可能直接跳过操作系统直接去访问硬件而是必须通过操作系统进而贯穿体系结构然后再间接访问到硬件所以总的来说一句话各种语言的本质都是对操作系统的系统调用接口进行的封装 体系结构图如下 文件描述符 谈谈什么是文件描述符 承接上述我们把系统层面的文件操作给搞明白了但是只是明白了像标志位传参这种比较表面的知识所以接下来我们就谈谈像文件描述符这种比较内部的知识所以什么是文件描述符呢文件描述符就是当我们打开一个文件之后这个文件会有一个返回值int我们一般使用 fd 来表示所以此时这个被打开文件的fd返回值就是我们要学习的文件描述符所以这个返回值具体是用来干什么的呢 想要明白这个问题此时就要从别的知识点或者别的概念迁移例任何一个进程在启动的时候默认会打开当前进程的三个文件标准输入、标准输出和标准错误如下表 语言标准输入标准输出标准错误C语言stdinstdoutstderrCcincoutcerr 所以无论是标准输入、标准输出还是标准错误本质上这些东西都是文件而已如下图 因为Linux系统下一切皆是文件所以向显示器打印本质就是向文件中写入如何理解 所以抽象成 标准输入–设备文件–键盘文件 标准输出–设备文件–显示器文件 标准错误–设备文件–显示器文件 所以得出结论任何一个进程启动默认就是会直接打开三个文件标准输入、标准输出和标准错误这三个文件是不需要我们使用系统接口open来打开的系统默认就是打开所以此时我们明白在我们自己使用open接口打开文件之前系统就已经默认打开了三个文件标准输入、标准输出和标准错误所以明白了这点我们就应该还可以明白我们自己使用open打开的文件是存在返回值的那么这三个文件肯定也是存在返回值的呀所以此时操作系统就规定在文件描述符中0表示标准输入1表示标准输出2表示标准错误也就是表示这三个默认打开的文件它们默认的返回值就是0 1 2 也就意味着如果此时去打开一个新的文件它的文件描述符只能从3开始再打开一个文件文件描述符只能是4…所以文件描述符不仅代表的是文件打开后的返回值本质上就是文件的编号也就是文件的一个别名以后操作系统就可以利用这些文件描述符0 1 2 3 4更加快速的找到对应的文件所以这就是文件描述符的好处 并且从另一个方面来看问题也就是操作系统可以利用这些文件描述符来管理文件那么这些文件描述符的在操作系统内部本质上是什么呢不难理解从0 1 2 3……开始这不就是一个数组吗这不就是数组下标吗所以本质上操作系统通过文件描述符对文件进行管理本质就是通过数组线性表的方式对文件进行管理增删查改 被打开文件和进程之间的联系 所以当用户想要访问一个文件操作系统一定要先管理好文件对象问题对应的打开文件的并不是文件自己而是用户通过进程的方式通过操作系统去打开一个文件 所以还是要以进程的形式去访问文件所以本质上还是在谈被打开文件和进程之间的关系从操作系统来看也就是进程pcb和struct file之间的关系 但是要注意一个进程是可以打开多个文件的就比如我们在代码中调用了多次的open接口此时就可以同时打开很多个文件所以进程和文件之间的关系不是1 1而是n 1 如下代码 int fd1 open(LOG1, O_WRONLY | O_CREAT, 0666); int fd2 open(LOG2, O_WRONLY | O_CREAT | O_TRUNC, 0666); int fd3 open(LOG3, O_WRONLY | O_APPEND | O_CREAT, 0666); int fd4 open(LOG4, O_RDONLY)并且操作系统为了能够让进程快速的找到文件所以操作系统内部是这样维护文件的定义一个数据结构struct file_struct这个数据结构是一个数组结构并且是一个指针数组该数组中的数据是一个一个的 struct file*fd_array[] 的指针这个结构体就是用来和上述的文件对象结构体struct file挂钩的也就是用来存储这些文件对象的地址的并且我们的进程pcb中还包含了一个struct files_struct*files的一个结构体指针对象本质上是因为一个文件加载到内存是先加载该文件对应的进程属性也就是进程pcb而不是加载代码和数据并且需要通过该进程pcb快速的找到相应的文件对象 具体如下图所示 图例文字描述 当从磁盘中加载一个文件到内存之时操作系统根据先描述再组织管理文件为文件创建一个struct file对象创建之后因为这个打开的行为一定是某个进程让操作系统打开的所以此时操作系统就会找到这个进程的pcb在找到这个pcb的同时会把内存中对应struct file对象的地址放到struct files_struct这个结构体数组为空的下标中所以找到进程pcb后操作系统就可以通过该进程pcb中的*files指针找到该数组进而找到某个下标对应的文件对象然后把该数组对应的下标也就是文件描述符返回给进程的调用者也就是用户所以当我们打开一个文件此时就肯定会对应着有一个文件描述符也就是有一个数组下标这也就是进程和被打开文件之间的关系导致的进而通过进程可执行文件我们就可以对相应的文件进行操作了。 总文件描述符的本质就是一个数组下标 感兴趣可以参考该链接文件描述符详解 深入缓冲区 搞定了上述有关文件描述符的知识此时我们就可以来看看和文件描述符息息相关的缓冲区的知识了操作系统会将文件对象对应的缓冲区中的数据给刷新到外设中磁盘所以本质我们使用的write、read函数都是拷贝函数它们可以把我们想要写入的数据字符串给拷贝到文件对象对应的缓冲区中并且注意操作系统具体什么时候刷新缓冲区的数据是有操作系统自己决定的例如可以是在缓冲区中的数据满了再刷新也可以是没满的时候因为别的原因刷新都是可能的反正就是按照自己的刷新策略进行刷新上述是写入到缓冲区的情况读取本质上是同理的但是是先找到在磁盘上的文件然后把磁盘上的文件拷贝到对应的缓冲区中然后再把该缓冲区的数据拷贝到我想要拷贝到的文件中这个就是读取本质还是通过缓冲区来完成的所以下述让我们通过理解为什么一切皆文件来深入了解缓冲区如下 如何理解一切皆文件 首先我们要明白一个点就是所有的外设你想要和它进行交互也就是允许它供给我们的使用那么这些外设就要有相应的读写方法因为只有读写方法我们才可以向该外设写入数据或者是向该外设读取数据所以外设就为我们提供了相应的驱动程序我们就可以通过相应的驱动程序来访问和使用对应的外设了如下图所示 所以在我们上述所说的一个文件被加载到内存时此时这个文件对象中的众多属性中就会包含一个有关读写数据的函数指针通过这两个指针就可以访问到相应的需要访问到的外设驱动程序上对应的读写函数间接就可以调用相应的外设来帮我们完成文件中代码和数据需要的功能实现所以此时我们就以我们的键盘外设为例来看一看进程和被打开文件之间的关系到底是怎样的吧 首先我们创建了一个可执行文件并且此时该文件中的代码和数据包含了调用系统接口open的代码我们使用open去打开了一个在磁盘中安静睡觉的文件此时操作系统就会帮我们去把该文件对应的部分数据和属性加载到内存并且生成一个struct file的结构体对象来存储并且会把该结构体对象的地址给给一个struct files_struct的顺序表类型结构体(目的提高效率)并且此时这个结构体对象此时除了包含着该文件对应简单的属性之外还有操作系统给与它的各种权限和功能例如可以通过结构体中的两个指针去访问任意外设的驱动程序上的有关读写函数此时就可以将对应的数据拷贝到驱动程序之中生成了struct file之后此时我们自己的可执行文件进程操作系统为了管理这个进程就会像管理文件一样为该进程生成一个结构体 strcut task_struct并且该结构体和struct file结构体一样它其中不仅有该进程对应的部分属性也有一个指针struct files_struct* file通过该指针该进程就可以找到文件描述符表就是一个存放各种文件对象的地址的数组所以此时进程中的代码和数据中的open接口就找到了对应的文件描述符表中的下标也就是相应我们要打开的文件. 所以访问键盘的本质就是在通过一个文件对象中的函数指针访问键盘驱动程序中的读写函数而我们的进程却只需要将对应文件中的代码和数据拷贝到相应的文件对象中的缓冲区就行所以对于进程来说它本质上只需要和被打开文件进行交互剩下的向外设或者从外设写入和读取的操作都只要交给文件对象文件结构体中的函数指针去完成就行了所以对于进程来说操作系统中的程序都是文件因为它本质上只需要和文件对象进行交互剩下和外设驱动程序之间的交互都只需要交给文件对象自己去完成就行了。 总结今天踏实了许多该博客也踏实了许多很多知识掌握的还是比较扎实所以慢就是快的理论还是很有道理的。
http://www.dnsts.com.cn/news/238606.html

相关文章:

  • 网站怎么做百度优化申请网站就是做网站吗
  • 有个虚拟服务器建设网站做网络销售哪些网站比较好
  • 网站开发模块学些什么网站开发中的qq登录
  • 怎么在百度上做公司网站做商城网站外包
  • 有哪些可以做翻译兼职的网站吗查询网站的注册信息
  • 行业协会网站建设方案书网站做公司
  • 襄阳做淘宝网站推广网站建设要多少钱
  • 正大建设集团股份有限公司网站杭州津伟网络科技有限公司
  • 国内网站主机wordpress 特点
  • 网站推广句子开个网要多少钱
  • 西安学建网站鞍山市住房和城乡建设网站
  • 晋中公司做网站公司网站建设怎么协调内容与保密
  • 龙华做网站天无涯网络商丘手机网站建设
  • 天猫网站设计网站建设技术哪些方面
  • 邯郸网站建设信息沧州网页重做
  • 深圳宝安区网站建设公司福州朝阳房产网站建设
  • 个人网站要多少钱中国公路建设行业协会网站上
  • 注册网站需要多久WordPress中文seo
  • 做pc网站排东莞厚街天气
  • 网站主机免费申请微建站平台
  • mysql 收费 网站建设c# 网站开发教程
  • 重庆seo网站建设python菜鸟教程
  • 山西公司网站建设网站设计文字大小
  • 盗用别人公司的产品图片做网站深圳市建筑工务署
  • 网站首页排名商丘的互联网公司
  • 有口碑的南通网站建设安徽电子健康卡小程序
  • 寄生虫网站排名代做营销推广策略有哪些
  • 微信商城软件开发seo优化排名推广
  • 安康网站建设公司报价杭州建设网站免费
  • wordpress all in one新闻源网站做黑帽seo