第二讲 文件与目录操作.ppt

  1. 1、本文档共93页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二讲 文件与目录操作

第二讲 文件与目录操作 任立勇 电子科技大学计算机学院 目 录 文件描述符 文件的打开、创建、关闭 文件定位 文件的读、写 文件共享问题 文件的访问权限 文件描述符 对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。 通常情况下,文件描述符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的每次写循环期间每次向磁盘写一块。内核决定是写整块还是写块中的一部分,如果是后者,则内核需要先将该块从磁盘读如到高速缓冲区中,再修改需要的部分;如果

文档评论(0)

amngta + 关注
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档