【问题标题】:Using the open() system call使用 open() 系统调用
【发布时间】:2010-10-10 10:12:48
【问题描述】:

我正在编写一个将输出写入文件的程序。如果这个文件不存在,我想创建它。

目前,我在调用 open 时使用以下标志: O_WRONLY | O_CREATE

但是,当它创建文件时,它没有给我任何写入权限...

如何使用 open 以便在文件不存在时创建文件,但在需要时以必要的权限创建文件?

谢谢!

【问题讨论】:

    标签: c file unix


    【解决方案1】:

    请注意,在 POSIX(Unix、Linux、MacOS 等)下,您可以使用您选择的任何权限打开和创建文件,包括 0(任何人都没有权限),但如果打开以进行写入,仍然可以写入文件。

    【讨论】:

      【解决方案2】:

      只需使用open 的可选第三个参数:

      int open(const char* pathname, int flags, mode_t mode);
      

      像这样:

      open("blahblah", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH);
      

      man open(2)

      【讨论】:

      【解决方案3】:

      来自manual

      O_CREAT

      如果文件存在,则此标志无效,除非在 O_EXCL 下注明 以下。否则,该文件应 创建;文件的用户 ID 应 设置为有效用户ID 过程;文件的组 ID 应设置为组 ID 文件的父目录或 进程的有效组ID; 和 访问权限位(见 ) 的文件模式应 设置为第三个值 参数作为类型 mode_t 修改 如下:执行按位与 在文件模式位和 补码中的对应位 进程的文件模式创建 面具。因此,文件模式中的所有位 文件中对应的位 模式创建掩码设置被清除。 当文件以外的位 设置了权限位,效果是 未指定。第三个论点确实 不影响文件是否打开 用于阅读、写作或两者兼而有之。 实施应提供一种方法 将文件的组 ID 初始化为 父目录的组 ID。 实现可能,但不一定, 提供实现定义的方式 将文件的组 ID 初始化为 呼叫的有效组ID 过程。

      所以看来您需要传递第三个参数来指定所需的文件权限。

      【讨论】:

        【解决方案4】:

        在 Linux 上,您可以使用第三个参数来传递权限。 S_IWUSR 应该是给你写权限的标志,但实际上你可能想要使用更多的标志而不是那个标志(按位或一起)。查看手册页以获取权限标志列表。

        【讨论】:

          【解决方案5】:

          您可能需要第三个参数。例如:

          打开('路径',O_WRONLY|O_CREAT,0640);

          【讨论】:

          • 就是这样!谢谢!
          • 我有点偏爱@David 使用标志常量 (S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH) 而不是硬编码的 perms,但除此之外是一个很好的答案。
          • 是的,他的回答更好。我的只是指向第三个参数的快速指针(我的字符串甚至无效!)。
          • 当使用 | 的单个参数使用多个参数时,这叫什么? “标志”在谷歌上没有给我任何结果
          猜你喜欢
          • 2015-06-02
          • 2015-01-06
          • 1970-01-01
          • 2012-10-21
          • 1970-01-01
          • 2013-02-15
          • 2021-09-16
          • 1970-01-01
          • 2015-04-20
          相关资源
          最近更新 更多