首先,这里讨论的函数均是不带缓存的I/O,即每个read和write都调用内核中的一个系统调用。
这里讨论5个函数,分别是open、read、write、lseek以及close。
使用以下函数及常数,需包含头文件fcntl.h
文件描述符(handle)是一个非负整数,有以下三个特殊文件描述符
- 0 —— 标准输入(STDIN_FILENO) (需包含头文件unistd.h)
- 1 —— 标准输出(STDOUT_FILENO)
- 2 —— 标准错误输出(STDERR_FILENO)
int open(const char * pathname, int oflag, ……mode_t mode);
open函数返回文件描述符
参数pathname表示文件的名字
参数oflag包括以下选项:
- O_RDONLY, O_WRONLY, O_RDWR:这三个选项必须且只能选一个
- O_CREAT:若文件不存在则创建它
- O_TRUNC:若文件存在则将长度截为0
一般的组合为O_RDWR | O_CREAT | O_TRUNC
参数mode表示文件访问位
int close(int handle);
当一个进程终止时,它所有的打开文件都由内核自动关闭。
off_t lseek(int handle, off_t offset, int whence);
按系统默认,当打开一个文件时,除非指定O_APPEND选项,否则位移量被默认设为0,即从头开始,偏移量以字节为单位
lseek返回新偏移量的值
文件偏移量由参数offset和whence共同决定:
- whence=SEEK_SET,偏移量为距文件开始处的offset个字节
- whence=SEEK_CUR,偏移量为当前偏移量+offset
- whence=SEEK_END,偏移量为文件长度+offset
文件偏移量应是一个非负整数,但可以大于当前文件长度(这会在文件中造成一个空洞)
当多个进程同时打开同一文件时,它们有各自的偏移量,但拥有相同的文件访问权限
ssize_t read(int handle, void * buff, size_t size);
如read成功,read函数返回读取的字节数;若到达文件尾端,则返回0;读取出错返回-1
参数buff是存放读取数据的缓存的指针
参数size表示读取数据的长度,一般与缓存大小一致
sszie_t write(int handle, const void * buff, size_t size);
返回值、参数意义与read函数类似