open(UNIX环境高级编程笔记)

  调用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错误的基本思想是:如果有两个基于文件的函数低啊用,其中第二个调用函数依赖于第一个调用的结果,那么程序就是脆弱的。

猜你喜欢

转载自blog.csdn.net/The_perfect_world/article/details/89280224