我正在编写一个将输出写入文件的程序。如果此文件不存在,我想创建它。
目前,我在调用open时使用以下标志: O_WRONLY | O_CREATE
但是,当这创建文件时,它不会给我任何写入它的权限......
如何使用open来创建一个文件(如果该文件不存在),但会在需要时使用必要的权限创建它?
谢谢!
答案 0 :(得分:17)
您可能需要第三个参数。例如:
open('path',O_WRONLY|O_CREAT,0640);
答案 1 :(得分:14)
只需使用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)
。
答案 2 :(得分:1)
在Linux上,您可以使用第三个参数来传递权限。 S_IWUSR应该是给你写权限的标志,但实际上你可能想要使用更多的标志而不是那个(按位或一起)。检查联机帮助页以获取权限标记列表。
答案 3 :(得分:1)
来自manual:
O_CREAT
如果文件存在,除非在O_EXCL下注明,否则此标志无效 下面。否则,文件应该是 创建;文件的用户ID 设置为的有效用户ID 处理;文件的组ID 应设置为的组ID 文件的父目录或 过程的有效组ID; 并 访问权限位(见 )文件模式应该 设置为第三个的值 参数作为mod_t类型修改 如下:执行按位AND 在文件模式位和 补码中的相应位 进程'文件模式创建 面具。因此,文件模式中的所有位 其中的相应位在文件中 模式创建掩码设置被清除。 当文件以外的位 权限位设置,效果是 不确定的。第三个论点是 不影响文件是否打开 用于阅读,写作或两者兼而有之。 实现应提供一种方法 将文件的组ID初始化为 父目录的组ID。 实施可能,但不一定, 提供实现定义的方式 将文件的组ID初始化为 呼叫的有效组ID 过程
因此,您似乎需要传递指定所需文件权限的第三个参数。
答案 4 :(得分:1)
请注意,在POSIX(Unix,Linux,MacOS等)下,您可以打开并创建一个具有您选择的任何权限的文件,包括0(没有任何人的权限),但如果打开写入,仍然会写入该文件。