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

时间:2010-07-29 12:48:29

标签: cocoa xcode macos unix

这两个代码段生成具有不同文件权限的文件。示例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

2 个答案:

答案 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