这两个代码段生成具有不同文件权限的文件。示例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);
}
创建: -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);
}
创建: ---------- 1我的工作人员5月29日00:41 Test2.txt
答案 0 :(得分: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);
这相当于0666.请注意,此模式随后被进程的umask屏蔽,这意味着您指定的权限通常会减少一些。典型的umask是0022,这将导致0666&的模式。 ~0222 = 0644,即-rw-r--r--
。
从男子打开:
oflag 参数可能表示如果文件不存在(通过指定
O_CREAT
标志),则创建该文件。在这种情况下,open需要第三个参数mode_t mode
;该文件使用模式模式创建,如chmod(2)
中所述,并由流程'umask值修改(请参阅umask(2)
)。
答案 1 :(得分:2)
int open(const char *pathname, int flags, mode_t mode);
参数 mode 指定在创建新文件时使用的权限。见http://linux.about.com/od/commands/l/blcmdl2_open.htm
在您的情况下,您需要将模式设置为值0644