【问题标题】:fopen and open produce files with different file permissionsfopen 和 open 生成具有不同文件权限的文件
【发布时间】:2011-03-22 17:06:21
【问题描述】:

这两个代码 sn-ps 生成具有不同文件权限的文件。示例 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 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 me staff 5 7 月 29 日 00:41 Test2.txt

【问题讨论】:

    标签: cocoa xcode macos unix


    【解决方案1】:

    当您使用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--

    来自ma​​n open

    oflag 参数可以指示如果文件不存在则将被创建(通过指定O_CREAT 标志)。在这种情况下, open 需要第三个参数mode_t mode;该文件是使用模式 mode 创建的,如chmod(2) 中所述,并由进程的 umask 值修改(参见umask(2))。

    【讨论】:

    • 谢谢!这完美地工作。我不知道我是怎么错过的,因为我浏览了十几次文档。现在我不必使用“fchmod”组合了。
    【解决方案2】:
    int open(const char *pathname, int flags, mode_t mode);
    

    mode 参数指定创建新文件时使用的权限。见http://linux.about.com/od/commands/l/blcmdl2_open.htm

    在您的情况下,您需要将 mode 设置为值 0644

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2011-03-31
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多