open函数
// opne函数详解
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
- 功能: 既能打开一个已存在的文件,也能创建并打开一个新的文件
- 返回值:
- 成功则返回一个最小且未被占用的文件描述符,用于后续函数调用中指代该文件
- 若发生错误,则返回-1,并将errno置为相应的错误标志
- pathname参数:要打开的文件由pathname来标识,若pathname是一个符号链接,会对其进行解引用
- flags必选项:它是位掩码,用于指定文件的访问方式,从以下3个选项3选1作为flags参数,且只能选一个
- O_RDONLY, // 只读方式打开文件
- O_WRONLY, // 只写方式打开文件
- O_RDWR. // 读写方式打开文件
- flag可选项:可选择0或多个与必选项按位或起来作为falgs参数
- O_APPEND:表示追加
- O_CREAT:若文件不存在则创建之。使用此选项必须提供第3个参数mode,表示该文件的访问权限
- O_EXCL:若同时指定了O_CREAT,并且文件已经存在,则出错,返回
- O_TURNC:若文件已经存在,将其长度截断了0字节
- O_NONBLOCK:对于设备文件,以O_NONBLOCK方式打开可以做非阻塞IO
- mode参数:它也是位掩码参数。mode指定了文件访问权限,SUSv3规定,其数据类型为
mode_t
,
- mode参数可以指定为数字,通常为8进制,更为可取的做法是对0个或多个位掩码常量进行逻辑或操作
- 若open未指定O_CREAT参数,则省略mode参数。
- 能影响新建文件权限的2个因素
- mode参数影响
- 进程的umask值
- 可能存在的父父目录的默认访问控制列表的影响
close
int close(int fd);
// 成功返回0,失败返回-1并设置errno值
// 当一个进程终止,内核对该进程所有尚未关闭的fd调用close将其关闭
// 对于一个长时间运行的程序,打开的文件描述符一定要记得关闭
open使用举例
只读方式打开一个文件
fd = open("a.txt", O_RDONLY);
// a.txt必须存在,若不存在,则打开失败
有则打开,无则创建
fd = open("a.txt", O_RDWR | O_CREAT, 0666);
// 以读写方式打开,若a.txt不存在,则创建之,被创建的文件权限为mode ~& umask
判断个文件是否存在
fd = open("b.txt", O_RDONLY | O_CREAT | O_EXCL, 0666);
// 若文件已经存在,则打开失败
// O_EXCL必须与O_CREAT一块使用才有效。
截断文件
fd = open("b.txt", O_RDONLY | O_TRUNC, 0666);
// 截断一个已经存在的文件a.txt,若文件不存在,则open失败
fd = open("a.txt", O_RDWR |O_CREAT | O_TRUNC, 0777);
// 截断文件,若文件不存在,则新建之
// 但此处“截断”无意义,因为若新建文件必然是截断的,不如把截断标志删掉。直接创建