c - 未指定模式的 Unix O_CREAT 标志

标签 c unix

当与 O_CREAT 标志一起使用时,UNIX open() 函数的定义是它需要一个名为 mode 的第三个参数来设置文件的权限。

如果未指定模式会怎样?

int file;
static const char filename[] = "test.test";

if ((file = open(filename, O_RDWR | O_CREAT | O_TRUNC)) == 1)
{
    perror("Error opening file.");
    exit(EXIT_FAILURE);
}

close(file);

使用这些标志创建的文件会发生什么情况?在我的系统上,我得到:

-r--r-s---  1 hyperboreean hyperboreean     0 2009-02-25 01:40 test.test

一种理论是 open 函数在堆栈中查找并检查模式参数,并最终使用它找到的随机整数。

标准对此有何规定?

最佳答案

POSIX 标准 (IEEE 1003.1:2008) 原型(prototype) open() 为:

int open(const char *path, int oflag, ...);

描述 O_CREAT 行为的部分没有说明如果省略必要的第三个参数会发生什么,这意味着行为未定义 - 一切皆有可能。

在实践中,很可能会使用本应用作堆栈帧或返回地址或类似内容的堆栈部分 - 合理的近似值,可以将其视为随机整数。

POSIX 2008标准为 open() 提供了一些有趣的新(和有用的)标志,包括:

  • O_FDCLOEXEC 指定在打开时执行关闭。
  • O_DIRECTORY 指定文件必须是一个目录。
  • O_NOFOLLOW 指定不跟踪符号链接(symbolic link)。

关于c - 未指定模式的 Unix O_CREAT 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/584210/

相关文章:

sockets - 为什么在从 Unix 套接字读取时使用 netcat 发送 ^D 不会触发 EOF?

c - 如何手动处理MacBook上所有插入的USB设备

linux - 我如何恢复到以前的 SVN 提交?

c - 我收到此警告 : sizeof on array function parameter will return size of 'const char *' instead of 'const char []'

c - 从cmd行读取命令,并在C中执行它们

regex - 这个awk语句是什么意思?

linux - 将文件夹内容递归移动到嵌套文件夹中

java - 使用 Jconsole 监控远程系统

c - 动态内存分配和指针?

c - 如何为 x86 汇编语言选择正确的源