- 1、本文档共93页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二讲 文件与目录操作
第二讲 文件与目录操作 任立勇 电子科技大学计算机学院 目 录 文件描述符 文件的打开、创建、关闭 文件定位 文件的读、写 文件共享问题 文件的访问权限 文件描述符 对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。 通常情况下,文件描述符0、1、2特指标准输入、标准输出、标准错误。用户程序可直接使用它们,而不需要打开。它们也可以由常数代替:stdin, stdout, stderr(在头文件中stdio.h定义) 用户文件描述符表(内核结构) Open函数 int open( const char *pathname, int oflag, …); 该函数打开或创建一个文件。其中第二个参数oflag说明打开文件的选项,第三个参数是变参,仅当创建新文件时才使用。 O_RDONLY::只读打开; O_WRONLY:只写打开; O_RDWR:读、写打开; O_APPEND:每次写都加到文件尾; O_CREATE:若此文件不存在则创建它,此时需要第三个参数 O_EXCL:如同时指定了O_CREAT,且文件存在,此时将出错。 O_TRUNC:如果此文件存在,并以读写或只写打开,则文件长度0 由open返回的文件描述符一定是最小的未用描述符数值。 Open函数(续) Open函数在内核完成的工作: Namei Creat函数 int creat( const char *pathname, mode_t mode); 该函数用于创建一个新文件,其等效于open函数的如下调用: open( pathname, O_WROLY | O_CREATE | O_TRUNC, mode); creat函数的一个不足之处是它以只写方式打开所创建的文件。在提供open的新版本之前,如果要创建一个临时文件,并要先写该文件,然后又读该文件。则必须先调用creat,close,然后再open,但现在则不必。 Close函数 int close( int filedes ); 该函数关闭以前打开的一个文件。关闭文件的同时也释放该进程加在该文件上的所有记录锁。当一个进程终止时,它所有的打开文件将由内核自动关闭。 内核对文件描述符、对应的文件表项和索引节点表项进行相应的处理,来完成关闭文件的操作。 进程关闭文件后,就不能通过该文件描述符操作该文件;当一个进程正常退出是,内核将关闭所有打开的文件描述符。 Read函数 ssize_t read( int filedes, void *buf, size_t nbytes); read函数从打开的文件中读数据。如成功,则返回实际读到的字节数,如已到达文件的末尾,则返回0;有多种情况可使实际读到的字节数少于要求读的字节数: 读普通文件,在读到要求字节数之前就到达文件尾; 当从终端设备读,通常一次最多读一行; 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数; 某些面向记录的设备,如磁带,一次最多返回一个记录。 读操作完成后,文件偏移量将从读之前的偏移量加上实际读的字节数。 Read函数 因为read算法的循环每次从文件系统中读取至少一个整块到高速缓冲区中,但有可能只拷贝其中的一部分到用户缓冲区。 一个索引节点的直接块或间接块中某些块可以有零值。如果一个进程企图读从这样的块中读数据,内核将在read循环中分配任意一个缓冲区,将内容清零,然后把该缓冲区拷贝到用户地址; 索引节点在read调用期间一直是锁住的,从而提供给进程一个和该调用开始时一致的文件视图。但在系统调用之间,内核可能抢先进程,因此可能导致当多个进程同时读写同一个文件时,产生意想不到的结果。 Read算法 Write函数 ssize_t write( int filedes, const void *buf, size_t nbytes); 该函数返回实际写的字节数。如果出错,则返回-1。write出错的原因可能是磁盘满、没有访问权限、或写超过文件长度限制等等。 对于普通文件,写操作从文件的当前偏移量开始写,除非打开文件时指定了O_APPEND选项。完成后,文件偏移量加上实际写的字节数。 练习:以O_APPEND选项打开一个文件写,试验能否用lseek指定文件偏移量。? write函数 如果文件中还没有要写的字节偏移量所对应的块,内核要用算法alloc分配一个新块或者多个块(如果偏移量是一个间接块中的偏移量)。写操作结束,如果文件大小变大,则需要修改索引节点。 内核在write的每次写循环期间每次向磁盘写一块。内核决定是写整块还是写块中的一部分,如果是后者,则内核需要先将该块从磁盘读如到高速缓冲区中,再修改需要的部分;如果
您可能关注的文档
- 第二章地理信息系统的空间数据结构和数据库.ppt
- 第二章基本信息论9_信源编码.ppt
- 第二章处理器管理谢旭升.ppt
- 第二章复杂控制系统.ppt
- 第二章多任务和多线程.ppt
- 第二章基本信息论7_熵速率和信道容量.ppt
- 第二章工具和运用.ppt
- 第二章微处理器(指令周期).ppt
- 第二章微机中的微处理器.ppt
- 第二章拉伸旋转12.15.ppt
- 摘自伟大济谜团教授推理指南.pdf
- 佳实践2010 hpc咨询会openfoam best practices.pdf
- 涂抹器开源组件概述下表列出了应用程序项目使用applicator components licensing.pdf
- 讲稿介绍理论lec3-ethical theoriesbeLEC3.pdf
- 监控安装源码.pdf
- 方差分析nag anova阶乘g04cac1 purpose大物实验报告cl05.pdf
- installation procedures for emc use onlyvplex安装程序仅使用.pdf
- 街头小掌柜推荐.pdf
- 【课件】全等三角形及其性质+课件+人教版(2024)八年级数学上册+.pptx
- 2024-2025学年选调生考试模考模拟试题往年题考附答案详解.docx
文档评论(0)