一般来说,UNIX文件操作只需要五个最基本功能就可以了,分别是打开文件open、关闭文件close、文件定位lseek、读文件read和写文件write。下面分别详细描述。
1 文件描述符
文件描述符fd是内核中对文件的表示,是一个int类型的整数,打开文件时返回一个文件描述符fd,其他文件操作都需要文件描述符fd指定对应的文件。
UNIX SHELL往往把文件描述符0、1、2分别对应标准输入、标准输出、标准错误,很多程序都用到这个特点从标准输入中读取数据,向标准输出写数据,这样通过I/O重定向就可以重复使用这样的程序。在POSIX标准中,
常量STDIN_FILENO,
STDOUT_FILENO,
STDERR_FILENO分别对应。标准输入、标准输出、标准错误文件描述符。
文件描述符的范围是[0,
OPEN_MAX],而其系统保证每次打开新文件时返回的文件描述符是可能的最小值,这样进程就可以先关闭标准输入输出,然后打开新文件,从而实现标准输入输出重定向。
2 打开文件open(2)
#include
int open(const char *pathname, int oflag, ... /* mode_t mode */ );
Returns: file descriptor if OK, -1 on error
open(2)打开文件,如果成功返回文件描述符,失败返回-1。第一个参数pathname是文件的路径,第二个参数oflag是文件打开参数,第三个参数mode是可选的,在创建文件的时候使用,是文件的权限。
参数oflag是文件打开参数,可以用多个常量通过或操作组合。
下面是三个必选的参数:
- O_RDONLY 只读
- O_WRONLY 只写
- O_RDWR 读写
这三个参数必须且只能选择一个。
下面是可选的参数:
- O_APPEND 每次write写文件的时候向文件的结尾写数据
- O_CREAT 如果文件不存在创建文件,这是open(2)需要提供第三个参数mode指定文件权限
- O_EXCL 如果O_CREAT置位且文件已经存在,产生一个错误
- O_TRUNC 如果文件存在且以只写或这读写模式成功打开,将文件的长度截为0
- O_NOCTTY 如果文件时终端设备,不将其分配为进程的控制终端
- O_NONBLOCK 如果文件时FIFO或字符设备、块设备时,启用非阻塞式IO
- O_DSYNC 写同步,write写文件等到数据写入磁盘完成
- O_RSYNC 读同步,read读文件等到同一区间的写文件操作结束
- O_SYNC 同步,write写文件等到数据和文件属性都写入磁盘完成
#include
int creat(const char *pathname, mode_t mode);
Returns: file descriptor opened for write-only if OK, -1 on error
create(2)创建一个文件,参数mode指定文件权限,等同于open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)。可以看出,create(2)返回的文件描述符对应文件以只写模式打开,不能读文件。在有些情况,如生成临时文件时,需要创建文件并对其读写,这时用open(pathname, O_RDWR | O_CREAT | O_TRUNC, mode)更好。
创建文件时,如果文件名长度大于NAME_MAX,文件名会被自动截断或产生错误。
3 关闭文件
4 文件定位
5 读写文件
阅读(1272) | 评论(0) | 转发(0) |