【发布时间】:2010-10-10 10:12:48
【问题描述】:
我正在编写一个将输出写入文件的程序。如果这个文件不存在,我想创建它。
目前,我在调用 open 时使用以下标志: O_WRONLY | O_CREATE
但是,当它创建文件时,它没有给我任何写入权限...
如何使用 open 以便在文件不存在时创建文件,但在需要时以必要的权限创建文件?
谢谢!
【问题讨论】:
我正在编写一个将输出写入文件的程序。如果这个文件不存在,我想创建它。
目前,我在调用 open 时使用以下标志: O_WRONLY | O_CREATE
但是,当它创建文件时,它没有给我任何写入权限...
如何使用 open 以便在文件不存在时创建文件,但在需要时以必要的权限创建文件?
谢谢!
【问题讨论】:
请注意,在 POSIX(Unix、Linux、MacOS 等)下,您可以使用您选择的任何权限打开和创建文件,包括 0(任何人都没有权限),但如果打开以进行写入,仍然可以写入文件。
【讨论】:
只需使用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)。
【讨论】:
S_IWUSER..而是S_IWUSR
来自manual:
O_CREAT
如果文件存在,则此标志无效,除非在 O_EXCL 下注明 以下。否则,该文件应 创建;文件的用户 ID 应 设置为有效用户ID 过程;文件的组 ID 应设置为组 ID 文件的父目录或 进程的有效组ID; 和 访问权限位(见 ) 的文件模式应 设置为第三个值 参数作为类型 mode_t 修改 如下:执行按位与 在文件模式位和 补码中的对应位 进程的文件模式创建 面具。因此,文件模式中的所有位 文件中对应的位 模式创建掩码设置被清除。 当文件以外的位 设置了权限位,效果是 未指定。第三个论点确实 不影响文件是否打开 用于阅读、写作或两者兼而有之。 实施应提供一种方法 将文件的组 ID 初始化为 父目录的组 ID。 实现可能,但不一定, 提供实现定义的方式 将文件的组 ID 初始化为 呼叫的有效组ID 过程。
所以看来您需要传递第三个参数来指定所需的文件权限。
【讨论】:
在 Linux 上,您可以使用第三个参数来传递权限。 S_IWUSR 应该是给你写权限的标志,但实际上你可能想要使用更多的标志而不是那个标志(按位或一起)。查看手册页以获取权限标志列表。
【讨论】:
您可能需要第三个参数。例如:
打开('路径',O_WRONLY|O_CREAT,0640);【讨论】: