调用open和openat函数可以打开或创建一个文件。
#include <fcntl.h> |
---|
int open(const char *path, int oflag, … / * mode_t mode * /); int openat(int fd, const char *path, int oflag, … / * mode_t mode * /); |
我们将最后一个参数写为 … ,ISO C用这种方法表明余下的参数的数量及其类型是可变的,对于open函数而言,仅当创建新文件时才使用最后这个参数
path参数是要打开或创建文件的名字。oflag参数可以用来说明此函数的多个选项。用下列一个或多个常量进行“或”运算符构成oflag参数
常用符号常量 | 解释 |
---|---|
O_RDONLY | 只读打开 |
O_WRONLY | 只写打开 |
O_RDWR | 读、写打开 |
O_EXEC | 只执行打开 |
O_SEARCH | 只搜索打开(应用于目录) |
O_APPEND | 每次写时都追加到文件的尾端。 |
O_CREAT | 若此文件不存在则创建它。 |
O_DIRECTORY | 如果path引用的不是目录,则出错 |
O_TRUNC | 如果此文件存在,而且为只写或读成功打开,则将其长度截断为0 |
大多数实现将O_RDONLY定义为0,O_WRONLY定义为1,O_RDWR定义为2,以与早期的程序兼容
oflag参数的符号常量不止这些,想要看详细的可以看 the value of oflag
由open和openat函数返回的文件描述符一定是最小的未用描述符。
fd参数把open和openat函数区分开,共有三种可能性
(1)path参数指定的是绝对路径名,在这种情况下,fd参数被忽略,openat函数就相当于open函数。
(2)path参数指定的是相对路径名,fd参数指出了相对路径名在文件系统中的开始地址。fd参数是通过打开相对路径名所在的目录来获取。
(3)path参数指定了相对路径名,fd参数具有特殊值AT_FDCWD。在这种情况下,路径名在当前工作目录中获取,openat函数在操作上与open函数类似。
//fcntl.h
#define AT_FDCWD -100 /* Special value used to
indicate openat should
use the current directory. */
openat函数是POSIX.1最新版本中新增的一类函数之一,希望解决两个问题。第一,让线程可以使用相对路径名打开目录中的文件,而不再只能打开当前工作目录。第二,可以避免time-of-check-to-time-of-use(TOCTTOU)错误。
TOCTTOU错误的基本思想是:如果有两个基于文件的函数低啊用,其中第二个调用函数依赖于第一个调用的结果,那么程序就是脆弱的。