fopen和open生成具有不同文件权限的文件

rho*_*bus 2 unix macos xcode cocoa

这两个代码段生成具有不同文件权限的文件.示例1创建了预期的默认文件权限,但示例2没有.对此有何解释?

操作系统:Mac OS X版本:10.6.4

Xcode版本:3.2.2,64位


// Example 1
FILE *fh1 = fopen("Test1.txt", "w+x");

if (fh1) {
    fwrite("TEST1", 1, 5, fh1);
    fclose(fh1);
}
Run Code Online (Sandbox Code Playgroud)

创建:-rw-r - r-- 1 me staff 5 29 Jul 00:41 Test1.txt

// Example 2
int fh2 = open("Test2.txt", O_EXCL | O_CREAT | O_WRONLY);

if (fh2 >= 0) {
    write(fh2, "TEST2", 5);
    close(fh2);
}
Run Code Online (Sandbox Code Playgroud)

创建:---------- 1我的员工5月29日00:41 Test2.txt

Joh*_*ica 6

使用O_CREAT时需要open在模式中添加第三个参数.例如:

int fh2 = open("Test2.txt",
               O_EXCL | O_CREAT | O_WRONLY,
               S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
Run Code Online (Sandbox Code Playgroud)

这相当于0666.请注意,此模式随后被进程的umask屏蔽,这意味着您指定的权限通常会减少一些.典型的umask是0022,这将导致0666&〜0222 = 0644的模式,即-rw-r--r--.

男人开放:

所述的oflag参数可以指示该文件将被创建,如果它不(通过指定存在O_CREAT标志).在这种情况下,open需要第三个参数mode_t mode; 使用模式模式创建文件,如chmod(2)进程'umask value(请参阅参考资料umask(2))中所述并进行修改.