使用 open() 系统调用

问题描述 投票:0回答:5

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

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

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

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

谢谢!

c file unix
5个回答
18
投票

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

open('路径',O_WRONLY|O_CREAT,0640);

14
投票

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

open
:

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

就像这样:

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

参见

man open(2)


1
投票

在 Linux 上,您可以使用第三个参数来传递权限。 S_IWUSR 应该是授予您写入权限的标志,但实际上您可能需要使用多个标志而不仅仅是该标志(按位或在一起)。检查联机帮助页以获取权限标志列表。


1
投票

摘自手册

O_CREAT

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.