open或openat函数都是打开或者创建一个文件的函数
#include<fcntl.h>
int open(const char *path, int aflag, .../*mode_t mode*/);
int openat(int fd, const char *path, int aflag, .../*mode_t mode*/);
参数介绍:
path:要打开或者创建的文件名
aflag:对将要操作的文件(即path参数所代表的文件)设置一些属性,常用属性如下
- 必要属性(必须设置且只能设置一个的属性):
- O_RDONLY 只读打开
- O_WRONLY 只写打开
- O_RDWR 可读可写打开
- O_EXEC 只执行打开
- O_SEARCH 只搜索打开(用于目录)
- 常用可选属性(可设置零个或多个的属性)
- O_APPEND 每次写时都追加到文件的末尾
- O_CREAT 若文件不存在则创建该文件
- O_NONBLOCK 如果打开的为特殊文件,则该文件的后续 I/O 操作为非阻塞方式
- O_TRUNC 如果此文件存在,且只写或读-写打开,则将其长度截断为0
- O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。用于检验文件是否存在
...(省略号):表示在创建文件时需要设置的文件权限
fd文件描述符(openat函数):表示当path为相对路径时,fd为该路径在文件系统中的开始地址
技巧:
由open和openat函数返回的文件描述符一定是最小未用描述符数值
open与openat的区别:
- 如果path参数为绝对路径名,则fd参数将被忽略,此时两函数等价
- 如果path参数为相对路径名,则fd参数指出相对路径名在文件系统中的开始地址,fd参数是通过打开相对路径名所在的目录名获取的(对于这一点我一直有个疑问,既然我都知道了路径名所在目录,那我完全可以用字符串连接函数得到绝对路径名,感觉openat有点多余)
- path参数制定了相对路径名,fd参数具有特殊值AT_FDCWD。这种情况下路径名在当前工作目录中获取,openat函数在操作上与open类似