与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);
Run Code Online (Sandbox Code Playgroud)
使用这些标志创建的文件会发生什么?在我的系统上,我得到:
-r--r-s--- 1 hyperboreean hyperboreean 0 2009-02-25 01:40 test.test
Run Code Online (Sandbox Code Playgroud)
理论上,open函数在堆栈上查找并检查mode参数,最后使用它找到的随机整数.
标准对此有何看法?
POSIX标准(IEEE 1003.1:2008)原型open()为:
int open(const char *path, int oflag, ...);
Run Code Online (Sandbox Code Playgroud)
描述行为的部分O_CREAT没有说明如果省略必要的第三个参数将会发生什么,这意味着行为是未定义的 - 任何事情都是可能的.
在实践中,使用堆栈的部分堆栈框架或返回地址或类似的东西很可能 - 合理的近似,可以被认为是随机整数.
该POSIX 2008标准有一些有趣的新的(有用)标志open(),包括:
O_FDCLOEXEC 在open时指定close-on-exec.O_DIRECTORY 指定该文件必须是目录.O_NOFOLLOW 指定不追逐符号链接.北风,你的怀疑可能并不是那么离谱。我希望能在克尼汉·里奇那里找到答案。不幸的是,我没有。我认为 O_CREAT 标志需要权限参数,如果不提供它, open() 将从堆栈中提取一个随机值,这在 C 中当然不会被注意到。
编辑:“随机”是指不可预测。它可能正在获取部分返回地址,该地址位于堆栈上参数的顶部。