第二章 文件管理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-12-18 6
输入输出示意图
2013-12-18
7
缓冲区主要功能
2013-12-18
8
文件流指针(ANSI C)
//come from /usr/include/stdio.h typedef struct _IO_FILE FILE; //come from /usr/include/libio.h strcuct _IO_FILE{ int _flags; char* _IO_read_ptr; /*Current read pointer*/ char* _IO_read_end; /*End of get are.*/ char* _IO_read_base; /*Start of putback+get area. */ char* _IO_write_base; /*Start of put area. */ char* _IO_write_ptr; /*Current put pointer.*/ char* _IO_write_end; /*End of put area. */ char* _IO_buf_base; /*Start of reserve area. */ char* _IO_buf_end; /*End of reserve area. */ …… int fileno; …… }
struct file_operations struct file_operations
进程信息 task_struct 打开文件列表 file_struct fd1=0 files fd1=1 fd1=2 fd1=3 fd1=4
V节点信息 I节点信息 „„
struct file_operations
2.1 ANSI C文件库函数与POSIX IO 2.2 POSIX 文件IO管理
2.3 文件属性
2.4 目录文件的基本操作
2013-12-18
2
2.1 ANSI C文件库函数与POSIX IO
2.1.1 ANSI C 文件处理的缓冲区机制 2.1.2 POSIX IO
2.1.1 ANSI C 文件处理的缓冲区机制
2013-12-18 21
open函数的flags
Flags
O_RDONLY O_WRONLY O_RDWR O_CREAT O_EXCL 只读方式打开文件 只写方式打开文件 可读可写方式打开文件 若欲打开的文件不存在则自动建立该文件 如果O_CREAT也设置,此指令会检查文件是否存在。若不存在则建立 此文件,否则将导致打开文件错误,此外,若O_CREAT与O_EXCL同 时设置,且欲打开的文件为符号连接,则打开文件失败
2013-12-18 9
2.1.2 POSIX IO
ANSI C库函数是在用户态实现的,需要通过内核实现
对文件的读写控制。
文件操作库函数需要依赖POSIX标准下的系统调用
open、close、write和read等来实现。
用户态下,每个打开的文件都将被分配一个唯一的非
负整数来标识该文件,称之为文件描述符。
操作。终端即行缓冲区。
不带缓冲区:标准I/O库不对字符进行缓存。
2013-12-18
5
标准流
//come from stdio.h /*Standard streams. */
extern struct _IO_FILE *stdin; /*Standard input stream. */
extern struct _IO_FILE *stdout; /*Standard output stream. */ extern struct _IO_FILE *stderr; /*Standard error output stream. */ /*C89/c99 say they’re macros. Make them happy.*/ #define stdin stdin #define stdout stdout #define stderr stderr
2013-12-18
20
打开文件
//come from /usr/include/bit/fcntl.h /*open/fcntl – O_SYNC is only implemented on blocks devices and on files located on an ext2 file system */ #define O_ACCMODE 0003 //主要访问权限位的低两 //位,用来测试权限用 #define O_RDONLY 00 #define O_WRONLY 01 #defein O_RDWR 02 #define O_CREAT 0100 #define O_EXCL 0200 //如果存在,返回错误 #define O_NOCTTY 0400 //终端控制信息 #define O_TRUNC 01000 #define O_APPEND 02000
指向一个struct file 类型的文件结构体,在struct file类 型结构体中,将指向对应的文件。
进程的文件表结构图如后页所示:
文件表结构图
打开的文件 struct file 文件读写位置 打开的mode 操作指针 文件v节点位置 文件读写位置 打开的mode 操作指针 文件v节点位置 文件读写位置 打开的mode 操作指针 文件v节点位置 文件读写位置 打开的mode 操作指针 文件v节点位置 文件读写位置 打开的mode 操作指针 文件v节点位置 V节点 V节点信息 I节点信息 „„
内核态下,使用一个struct file类型的结构体来保存打
开文件的基本信息。该类型定义位于 /usr/src/kernel/’uname -r’/include/linux/fs.h
2013-12-18 10
标准设备的文件描述符(POSIX C)
任何进程在运行时,Linux将默认为其打开三个流对象,其
文件描述符分别为0、1、2,对应的文件定义如下 //come fom /usr/include/unistd.h /*Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
2013-12-18
16
例二:将文件描述符转换为流对象
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> main() int fd; { FILE *stream;
V节点信息 I节点信息 „„
struct file_operations
V节点信息 I节点信息 „„
struct file_operations
V节点信息 I节点信息 „„
2013-12-18
13
文件描述符与文件流的转换
/*Return the system file descriptor for STREAM. */ extern int fileno(FILE * __stream) 此函数以某个流对象为参数,返回该流的文件描述符值。如果失 败,将返回-1 。 fopen()将实现某个流与一个文件描述符相接。声明如下:
说明
O_NOCTTY
O_TRUNC O_APPEND O_NONBLOCK O_NDELAY O_SYNC
2013-12-18
Linux系统中“一切皆文件”。Linux操作系统是以文件为
基础而设计的,除了常规文件以外,目录、设备、管道等
都属于文件。
文件主要包含两方面的内容:一是文件本身所包含的数据;
另外就是文件的属性,也称为元数据,包括文件访问权限、 所有者、文件大小、创建日期等。
ANSI C中的文件处理库函数,采用了缓冲区机制,根据使
if ( ( fp2=open("fileno_exp.c",O_WRONLY ) ) == -1 ){ printf("fileop.c file is :\t%d\n",fp1); printf("fileno_exp.c file is :\t%d\n",fp2); close(fp1); return 0; } close(fp2);
用需求的不同,可以选择使用全缓冲、行缓冲和无缓冲3种 缓冲区处理方式。
2013-12-18 4
缓冲区类型
全缓冲区:这种缓冲区默认大小为8192。在缓冲区满
或者显式调用刷新函数后才进行I/O系统调用操作。
行缓冲区:默认行缓冲区大小为128字节。当在遇到换
行符或者缓冲区满时,标准I/O库将执行I/O系统调用
fclose(stream);
}
printf("the content of the test.txt is:\n"); system("cat test.txt"); return 0; }
2013-12-18 18
2.2 POSIX文件I/O管理
2013-12-18
19
打开文件——open系统调用
printf("stdout is :\t%d\n",fileno(stdout)); printf("stderr is :\t%d\n",fileno(stderr));
2013-12-18 15
例一· :进程的文件描述符
if ( ( fp1=open ( "fileop.c“ , O_WRONLY ) ) == -1 ) perror("open"); perror("open"); exit(EXIT_FAILURE); exit(EXIT_FAILURE); { } }
#define STDERR_FILENO 2 /* Standard error output. */
2013-12Biblioteka Baidu18
11
文件表结构图
每个打开的进程都拥有一个struct task_struct类型的私
有结构体,其中的成员files用来指向该进程打开的文 件列表。
文件列表中列出了当前进程打开的所有文件,每一项
2013-12-18
14
例一:进程的文件描述符
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> main() {
int fp1,fp2;
printf("stdin is :\t%d\n",fileno(stdin));
函数原型: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
int open ( const char *pathname, int flags ); int open ( const char *pathname, int flags, mode_t mode ); 参数:pathname 要打开的文件名 flags 打开方式 mode 文件的存取权限 返回值:打开成功,返回打开文件的文件描述符 打开失败,返回-1
/* Create a new stream that refers to an existing system file descriptor. */
extern FILE *fdopen(int __fd, __const char* __modes) 此函数第一个参数为一个文件描述符,第二个参数为封装该流的 权限(即以何种方式打开fd的),如果执行成功,将返回一个流 对象。如果失败,将返回NULL。
unlink("test.txt");
fd=open("test.txt",O_CREAT|O_WRONLY,S_IREAD|S_IWRITE)
stream=fdopen(fd,"w");
2013-12-18
17
例二:将文件描述符转换为流对象
if(stream==NULL) printf("fdopen failed\n"); else { fprintf(stream, "Hello world\n");
相关文档
最新文档