南邮Linux-第6章_第1页
南邮Linux-第6章_第2页
南邮Linux-第6章_第3页
南邮Linux-第6章_第4页
南邮Linux-第6章_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 Linux文件与目录郑谦益、韩京宇内容概要6.1 文件系统概述6.2 文件的基本输入输出6.3 文件属性操作6.4 目录操作6.5 标准I/O库6.6 I/O重定向6.1.1文件系统概述文件系统的基本组成单位是文件, 文件中存放的数据通过文件系统与块设备上的块建立映射。文件系统将所有的文件通过目录连接成一棵目录树,Linux系统中的根目录是“/”。目录是一种特殊的文件,其内容由若干目录项构成(每个目录项包含文件名和i节点编号)。6.1.1文件系统概述每个目录项对应一个文件,也包括目录,目录项中记录了文件名和i-节点号。i-节点号对应所属文件i-节点在i-节点表中的位置, i-节点中记录

2、了除文件名外文件的所有信息。 6.1.2虚拟文件系统虚拟文件系统是对各种真实文件系统的抽象,真实文件系统通过这些接口与虚拟文件系统相连接,真实文件系统是这些抽象接口的具体实现。普通文件,管道,目录文件,设备文件(包括块设备文件和字符设备文件),套接字都通过虚拟文件系统提供统一的接口。6.1.2 虚拟文件系统 为了提高存取效率,在虚拟文件系统和真实文件系统之间建立基于页的高速缓冲,这样可以减少I/O操作的次数,提高文件的存取效率。6.1.3文件系统结构文件系统中逻辑块可归纳为三类,超级块、i-节点区和数据区。 超级块用于存放整个文件系统的管理信息,其中定义了各区的大小、i-节点分配表和数据区的位

3、置等管理信息。 6.1.3文件系统结构i-节点区用于存放i-节点,每个文件都有各自唯一的i-节点,i-节点中存放了与文件相关的所有信息,例如,文件内容在数据区的分布、文件的大小、权限管理信息和文件的创建时间等。数据区则是存放系统中所有文件的内容。 6.1文件系统概述应用编程接口包括 文件的输入输出操作文件属性操作目录操作标准I/O库I/O重定向6.2文件的基本输入输出文件基本输入输出操作是Linux内核提供的最基础的文件访问接口,在glibc中,这些操作对应的函数有open、read、write、lseek和close等。它们和Linux内核中的相应系统调用一一对应,glibc仅对这些系统调用

4、的硬件接口特性进行了封装。6.2文件的基本输入输出文件描述符表fd,是一个指针数组,每个指针指向一个file结构,用于记录一个打开文件的状态信息,其中f_pos记录打开文件的当前读写位置f_dentry打开文件所在目录f_op文件具体的操作集6.2文件的基本输入输出fd数组的前三个描述符0 代表标准输入1代表标准输出2代表标准错误输出6.2文件的基本输入输出int open(const char *pathname, int flags, mode_t mode);pathname: 文件的路径名flags :指定文件的操作模式mode :仅当创建新文件时使用,用于指定文件的访问权限位 返回值

5、:文件表述符6.2文件的基本输入输出ssize_t read(int fd, void *buf, size_t count) fd 文件描述符buf 存放读取数据的内存缓冲count 读取的字节数 返回值:读取的字节数6.2文件的基本输入输出ssize_t write(int fd, const void *buf, size_t count); fd 文件描述符buf 写入数据的缓冲区count 准备写入的字节数返回值:成功写入文件的字节数 6.2文件的基本输入输出off_t lseek(int fd, off_t offset, int whence); fd 文件描述符offset 移

6、动的偏移量whence 从何处开始计算偏移量 返回值:成功返回目前的读写位置6.2文件的基本输入输出int close(int fd); 6.2文件的基本输入输出标准输入输出文件的定义标准输入输出文件的定义 对于由Shell创建的进程,在进程的文件描述符表中,有三个继承自父进程的已打开文件,文件描述符分别为0、1和2。分别对应于标准输入、标准输出和标准错误输出。在 C语言函数库中,从两个不同的层次对它们进行了定义。6.2文件的基本输入输出1、文件描述符的定义(系统调用)由系统级函数库中的unistd.h定义,数据类型为整型,供系统函数库中的函数使用,例如,open,read,write和clo

7、se等函数,在unistd.h文件中的定义如下:#define STDIN_FILENO 0#define STDOUT_FILENO 1#define STDERR_FILENO 26.2文件的基本输入输出2、标准输入输出流的定义 由标准I/O函数库中的stdio.h文件定义,数据类型为FILE,供标准函数库的函数使用, 例如:fopen,fread,fwrite和fclose等函数。程序62int main(int argc, char *argv ) int fdin, fdout, n; char bufBUFSIZ; if(argc !=3) fprintf(stderr, Usag

8、e: %s filein fileoutn,argv0); exit(1); if(fdin = open(argv1,O_RDONLY) = -1) perror(argv1); exit(2); if(fdout = open(argv2,O_WRONLY | O_CREAT | O_TRUNC, PMODE) = -1) perror(argv2); exit(3); while(n = read(fdin, buf, BUFSIZ) 0) write(fdout,buf, n); exit(0); 6.3文件属性操作文件的属性信息存放于文件对应的i-节点中,对于不同类型文件系统,文件属

9、性的组织形式也不尽相同。为了获得统一的文件属性格式,Linux中定义了一个名为struct stat的数据结构。6.3文件属性操作(自学)struct stat dev_t st_dev; / 文件的设备编号ino_t st_ino; / i-节点号mode_t st_mode; / 文件的类型和存取权限nlink_t st_nlink; / 硬链接uid_t st_uid; / 用户ID gid_t st_gid; / 组ID dev_t st_rdev; / 设备类型off_t st_off; / 文件字节数unsigned long st_blksize; / 块大小unsigned l

10、ong st_blocks; / 块数time_t st_atime; / 最后一次访问时间time_t st_mtime; / 最后一次修改时间time_t st_ctime; / 最后一次改变时间(指属性) ;6.4目录操作从整体上看,文件系统对应一棵由目录和文件构成的树。目录是一种特殊的文件,其内容由若干个目录项组成。每个目录项中存放的是文件的名称和i-节点的入口地址。为了便于管理,每个目录中都包含当前目录“.”和父目录“.”,当前目录指向当前目录i-节点编号,父目录则记录了父目录对应i-节点的编号 。参见书上的65图6.4.1目录操作int mkdir(const char* path

11、name, mode_t mode); pathname 目录路径名mode 创建目录的模式,参见open函数返回值:成功返回0,否则1 mkdir在某目录中创建一个目录项,分配一个i-节点与目录项相链接,并分配一个逻辑块用于存放目录的内容,在其中建立两个目录,当前目录.和父目录”.”。6.4.1目录操作int rmdir(const char * pathname) ; pathname 目录的路径名 rmdir函数从目录中删除相应的目录项,并释放相应的i-节点,注意的是:rmdir函数只能删除空目录,也就是目录中只包含当前目录项和父目录项的目录。6.4.1目录操作int chdir(con

12、st char * pathname) ; pathname 新的工作路径 当前工作目录的信息以i-节点的形式记录在每个进程的进程控制块中,初始工作目录继承自父进程,进程在运行过程中可以改变工作目录,pwd命令显示的是Shell的当前工作目录. 6.4.1目录操作char *getcwd(char *buf, size_t size); buf 存放路径的缓冲区size 路径名包含的字节数 参见例子程序686.4.2 浏览目录中的文件目录是一种特殊的文件,在读取其中的目录项时,需借助于opendir、readdir和closedir函数,在这些函数中,对目录项的定义如下:struct dire

13、nt long d_ino; / i-节点号 char d_nameNAME_MAX+1; / 文件名 off_t d_off; / 在目录文件中的偏移量 unsigned short d_reclen; /文件名长度 6.4.2目录操作DIR * opendir(const char *pathname); pathname 目录路径名 返回值:成功,返回目录流,一组目录字符串,否则,返回错误 6.4.2目录操作struct dirent *readdir(DIR *dp); 返回下一个目录项 int closedir(DIR *dp); 关闭打开的目录 参见例子程序6-9int main(

14、int argc, char *argv) DIR *dirp; struct dirent *direntp;if(dirp = opendir(argv1) = NULL) fprintf(stderr,error message: %sn,strerror(errno); / 显示错误信息显示错误信息 exit(1); while(direntp = readdir(dirp) != NULL) printf(%sn, direntp-d_name);closedir(dirp);exit(0); 6.5标准I/O库read和write等底层系统调用函数进行输入输出时,在用户态和内核态之

15、间来回切换,每次读出或写入的数据量较少,导致频繁的I/O操作,增加了系统开销。标准I/O库是标准ANSI C规范的一部分,函数原型在文件stdio.h中定义,对底层I/O系统调用进行了封装,为程序员提供了带有格式转换功能的输入输出操作,并在用户空间增加了缓冲区管理。 6.5.2文件操作FILE * fopen(const char * path,const char * mode); 参数涵义: (1)path 要打开的文件路径 (2)mode 打开模式 (参见书上121页最下表格)成功, 返回指向被打开文件流指针,否则,返回NULL 6.5.2文件操作FILE的定义如下:typedef st

16、ruct short level; / 缓冲区满空程度 unsigned flags; / 文件状态标志 char fd; / 文件描述符 unsigned char hold; / 无缓冲则不读取字符 short bsize; / 缓冲区大小 unsigned char *buffer; / 数据缓冲区 unsigned char *curp; / 当前位置指针 unsigned istemp; / 临时文件指示器 short token; / 用于有效性检查 FILE;6.5.2文件操作标准I/O函数库提供了两种类型的流:文本流和二进制流。 文本流是一行行的字符,换行符表示这一行的结束。二

17、进制流则不考虑读写数据的格式转换,将文件看作由一系列字节构成字节序列。在标准I/O函数库中,存在三个预定义的文本流,它们分别是stdin、stdout和stderr, stdin指向标准输入流,对应于键盘;stdout指向标准输出流,对应于终端显示器;stderr指向标准错误输出流,通常,对应于终端显示器。6.5.2文件操作文件操作#include int main()FILE *fpt;fpt=fopen(output.txt,w); / 创建流fprintf(fpt,This is a test.);/ 输入字符串至流fclose(fpt);/关闭流 6.5.2文件操作文件操作size_t

18、 fread(void *buffer, size_t size, size_t nitems, FILE *inf); 参数:buffer 存放读取数据的缓冲区size 要读取数据类型字节数nitems 要读取的数量FILE 一个已打开的文件流 返回值:成功返回读取的字节数程序程序6-11int main()FILE *fpt;char text80;fpt=fopen(data.txt,r);fread(text,1,15,fpt);text15=0;printf(%sn,text);fclose(fpt);6.5.2文件操作文件操作size_t fwrite(const void *bu

19、ffer, size_t size, size_t nitems, FILE *outf);参数:buffer 存放输出数据的缓冲区size 要输出数据类型字节数nitems 要输出的数量FILE 一个已打开的文件流 返回值:成功,返回实际写入文件的字节数 程序6-12int main()FILE *fpt;char text80;sprintf(text,Fortytwo 42 bytes of data on the wall.);fpt=fopen(data2.txt,w);fwrite(text,1,strlen(text),fpt);fclose(fpt);6.5.2文件操作文件操作

20、int fclose(FILE *fp); 关闭文件流 6.5.3格式化输入输出int fprintf(FILE *stream, const char *format, .)参数: stream 一个已打开的文件流指针format 输出控制字符串作用:将缓冲区中的数据经格式转换后写入文件返回值:成功写入的字节数 程序6-13#include main()FILE *fp;float area,p=3.141592;int r;if(fp=fopen(sample,w)=NULL)printf(Error opening file !n);exit(0);fprintf(fp,Radius Arean);for(r=1;r10;r+)area=p*r*r;fprintf(fp,%4d %7fn,r,area);fclose(fp); 6.5.36.5.3格式化输入与输出格式化输入与输出int fscanf(FILE *stream, const char *format, .); 参数:stream 已打开的文件流动format 输入控制字符串 返回值:成功返回被赋值的数目程序6-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论