2010-07-29 32 views
2

这两个代码片段生成具有不同文件权限的文件。示例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我的工作人员5 7月29日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 7月29日00:41的test2.txt

回答

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))修改。

+0

谢谢!这工作完美。我不知道自从我在文档上搜索了十几遍以后,我错过了这些。现在我不必使用'fchmod'kludge。 – rhombus 2010-07-29 14:02:16