第1章内容回顾概述了计算机系统的硬件结构,从处理器的寄存器到指令的执行,中断以及中断处理程序,到多道程序设计,存储结构,cache到I/O。概述了操作系统的发展,以及取得的成就,到现代操作系统的特征,最后描述了Linux操作系统的结构。第2章基本文件I/O预习检查Linux文件类型的种类?普通文件、目录文件、设备文件、管道文件、套接字和链接文件等等常见系统调用文件操作?open(),creat(),close(),read(),write(),lseek(),fcntl(),access()等常见基于流的文件操作?fopen(),fclose(),fread(),fwrite(),fseek()等系统调用文件操作与基于流的文件操作的区别?本章目标了解文件访问基本概念掌握文件访问基本API掌握文件访问的C库函数了解文件访问基本API与C库函数的区别本章结构文件与文件访问基本概念基本文件I/O文件访问基本概念文件访问的C库函数文件访问的系统调用APILinux文件文件读写文件的创建、打开和关闭修改文件属性文件的随机存取文件的访问权限按字符读写文件文件的创建、打开和关闭文件的格式化输入输出按字符串读写文件按数据块读写文件文件的随机存取文件基本概念Linux常见的文件类型:普通文件目录文件设备文件管道文件套接字链接文件普通文件普通文件(regularfile):普通计算机用户看到的文件,仅仅是Linux文件类型中的一种,我们称之为普通文件,它们通常驻留在磁盘上的某处文本文件二进制文件目录文件目录文件(directory),主要目的是用于管理和组织系统中的大量文件设备文件设备文件,Linux操作系统把每一个I/O设备都看成一个文件,与普通文件一样处理,这样可以使文件与设备的操作尽可能统一,对I/O设备的使用和一般文件的使用一样,不必了解I/O设备的细节。块设备文件:表示文件系统高速缓存的设备,例如硬盘驱动器设备文件:表示非高速缓存的设备,例如磁带驱动器、鼠标和系统终端管道文件管道文件(namedpipe),主要用于在进程间传递数据套接字文件套接字文件(socket),类似于管道文件。管道文件用于本地通信,而套接字允许网络上的通信符号链接文件符号链接文件(symboliclink),这个文件包含了另一个文件的路径名文件操作基本元素文件操作相关的最基本元素是:目录结构、索引节点和文件的数据本身目录结构索引节点文件的数据文件访问基本概念通过opendir()及相关函数,可以获取目录结构信息通过系统调用stat()可以从索引节点获得文件信息通过常用的文件操作open()、read()等等可以访问文件的数据。文件访问系统API最常用的文件操作系统调用open()打开文件create()创建文件close()关闭文件read()读取文件write()写入文件lseek()移动文件指针fcntl()access()文件控制open()系统调用#includesys/types.h#includesys/stat.h#includefcntl.hintopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);欲打开文件路径字符串对文件操作的标志新建文件访问权限成功返回文件描述fdopen()系统调用的标志O_RDONLY以只读方式打开文件O_WRONLY以只写方式打开文件O_RDWR以读写方式打开文件O_APPEND以追加模式打开文件,在每次写入操作指向之前,自动将文件指针定位到文件末尾。但在网络文件系统进行操作时却没有保证。O_CREAT如果指定的文件不存在,则按照mode参数指定的文件权限来创建文件。O_DIRECTORY假如参数pathname不是一个目录,那么open将失败。O_EXCL如果使用了这个标志,则使用O_CREAT标志来打开一个文件时,如果文件已经存在,open将返回失败。但在网络文件系统进行操作时却没有保证。O_NOCTTY打开一个终端特殊设备时,使用这个标志将阻止它成为进程的控制终端。O_NOFOLLOW强制参数pathname所指的文件不能是符号链接。O_NONBLOCK打开文件后,对这个文件描述符的所有的操作都以非阻塞方式进行。O_NDELAY和O_NONBLOCK完全一样。O_SYNC当把数据写入到这个文件描述符时,强制立即输出到物理设备。O_TRUNC如果打开的文件是一个已经存在的普通文件,并且指定了可写标志(O_WRONLY、O_RDWR),那么在打开时就清除原文件的所有内容。但打开的文件是一个FIFO或者终端设备时,这个标志将不起作用。creat()系统调用#includesys/types.h#includesys/stat.h#includefcntl.hintcreat(constchar*pathname,mode_tmode);creat()相当于open使用了参数flags等于O_CREAT|O_WRONLY|O_TRUNC成功返回文件描述fd欲打开文件路径字符串新建文件访问权限read()系统调用#includeunistd.hssize_tread(intfd,void*buf,size_tcount);成功返回读取字节数读取文件的文件描述符读取字节的写入内存地址读取的字节数write()系统调用#includeunistd.hssize_twrite(intfd,constvoid*buf,size_tcount);成功返回读取字节数写入文件的文件描述符写入字节的读取内存地址写入的字节数lseek()系统调用#includesys/types.h#includeunistd.hoff_tlseek(intfildes,off_toffset,intwhence);成功返回指定文件的读写位置文件描述符移动偏移量移动的起始位置lseek()系统调用SEEK_SET从文件头开始计算,文件指针移动到offset个字节位置。SEEK_CUR从文件指针当前位置开始计算,向后移动offset个字节的位置。SEEK_END文件指针移动到文件结尾移动起始位置access()系统调用#includeunistd.hintaccess(constchar*pathname,intmode);成功返回0满足文件权限参数欲打开文件路径字符串文件权限参数access()系统调用文件权限参数R_OK判断文件是否有读权限。W_OK判断文件是否有写权限。X_OK判断文件是否有可执行权限。F_OK判断文件是否存在。fcntl()系统调用#includeunistd.h#includefcntl.hintfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);文件描述符指定函数的操作文件描述符文件锁操作结构体成功返回0满足文件权限参数访问文件的C库函数基于系统调用方法的封装并增加了额外的功能采用缓冲技术来提高程序的效率、输入解析以及格式化输出等。在处理设备、管道、网络套接字和其他特殊类型的文件的时候,必须使用系统调用I/0方法。文件打开关闭#includestdio.hFILE*fopen(constchar*path,constchar*mode);intfclose(FILE*fp);文件路径名文件打开模式成功返回0文件指针成功返回文件指针文件打开关闭打开模式模式模式说明“r”以只读方式打开文件,文件打开时指针位于文件首。“r+”以读和写方式打开文件,文件打开时指针位于文件首。“w”以只写方式打开一个文件,如果文件已经存在,清空文件内容,如果文件不存,则创建一个新的文件。文件打开时指针位于文件首。“w+”以读和写方式打开一个文件,如果文件已经存在,先清空文件内容,如果文件不存在,则创建一个新的文件。文件打开时指针位于文件首。“a”以追加写的方式打开一个文件,如果文件不存在,则创建一个新文件,文件打开时指针位于文件尾,而且在每次写操作前,文件指针自动先移动到文件尾。“a+”以追加写的方式打开一个文件,如果文件已经存在,先清空文件内容,如果文件不存在,则创建一个新文件,文件打开时指针位于文件尾,而且在每次写操作前,文件指针自动先移动到文件尾。按字符读写文件#includestdio.hintfgetc(FILE*stream);intfputc(FILE*stream);fgetc()和fputc()分别还有另外一个别名getc()和putc(),它们的使用方法和功能是完全一样的,只是后者是前者的宏定义的别名。文件指针成功返回读取的字符的int值成功返回写入的字符的值按字符串读写文件#includestdio.hchar*fgets(char*s,intsize,FILE*stream);intfputs(constchar*s,FILE*stream);存放读出来的字符串的地址一次最多读取n个字符文件指针要写入文件的字符串成功返回读取的字符串成功返回非负整数按数据块读写文件#includestdio.hsize_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream);size_tfwrite(constvoid*ptr,size_tsize,size_tnmemb,FILE*stream);要读取的数据的地址数据块的大小要写入的数据块的数目成功返回读取的数据块的数量成功返回写入的数据块的数量要写入的数据的地址数据块的大小要读取的数据块的数目读取文件指针写入文件指针文件格式化输入输出#includestdio.hintfprintf(FILE*stream,constchar*format,...);intfscanf(FILE*stream,constchar*format,...);文件指针文件指针字符串格式字符串格式成功返回实际写入文件的字符数成功返回读取文件的字符数文件随机存取#includestdio.hintfseek(FILE*stream,longoffset,intwhence);文件指针移动偏移量移动的起始位置成功返回0文件随机存取SEEK_SET从文件头开始计算,文件指针移动到offset个字节位置。SEEK_CUR从文件指针当前位置开始计算,向后移动offset个字节的位置。SEEK_END文件指针移动到文件结尾移动起始位置文件随机存取#includestdio.hlongftell(FILE*stream);获得当前指针位置的函数成功返回当前位置文件指针本章总结文件与文件访问基本概念基本文件I/O文件访问基本概念文件访问的C库函数文件访问的系统调用APILinux文件文件读写文件的创建、打开和关闭修改文件属性文件的随机存取文件的访问权限按字符读写文件文件的创建、打开和关闭文件的格式化输入输出按字符串读写文件按数据块读写文件文件的随机存取描述了linux常见文件的类型,文件属性。文件访问基本概念详细介绍了常见文件访问的C库函数详细介绍了常见文件访问基本API实验及实验注意事项任务1:学习如何使用系统调用open()打开文件和关闭任务2:学习如何使用read()系统调用读文件任务3:学习如何用read()和write()系统调用进行文件读写任务4:学习如何通过lseek()系统调用移动文件指针任务5:学习使用access()系统调用来判断文件的访问权限任务6:了解fcntl()系统调用的基本用法任务7:学习如何使用C库函数打开和关闭文件任务8:学习使用C库函数按字符读取文件实验及实验注意事项任务9:学习使用C库函数按字符读和写文件任务10:学习使用C库函数,按字符串方式读文件任务11:学习使用C库函数按字符串方式读和写文件任务12:学习如何使用