文件I/O 系统调用 ——这些不带缓存的函数都是内核提供的系统调用。它们不是ANSI C的组成部分,但是POSIX的组成部分。
- open()打开文件
- create()创建文件
- close()关闭文件
- read()读取文件
- write()写入文件
- Iseek()文件定位
文件操作方式
系统调用(内核提供) C库(标准C函数)
- 标准库函数:遵守ISO标准,基于流的I/O,对文件指针(FILE结构体)进行操作
- 系统调用:兼容POSIX标准,基于文件描述符的I/O,对文件描述符进行操作
文件描述符
- 对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
- 在POSIX应用程序中,整数0、1、2被替换成符号常数STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这些常数都定义在头文件<unistd.h>中。(定义了标准宏)
- 文件描述符的范围是0--OPEN_MAX。早期的UNIX版本采用的上限值是19(允许每个进程打开20个文件)。现在很多系统则将其增加至63,Linux为1024。
文件描述符与文件指针
- 标准文件指针
stdin 0;
stdout 1;
stderr 2;
- fdopen()通过fdopen函数可以将文件描述符转换为文件指针
FILE *fdopen(int fd, const char *mode);mode=>对文件的操作 “r”只读 “w”只写 “rw”读写
文件描述符=>文件指针(fd=>FILE*)
- fileno() 通过fileno函数可以将文件指针转换为文件描述符
int fileno(FILE *stream);
文件指针=>文件描述符(FILE*=>fd)