什么是文件创建时的“open()”默认权限? [复制]

Posted

技术标签:

【中文标题】什么是文件创建时的“open()”默认权限? [复制]【英文标题】:What are `open()` default permissions at file creation? [duplicate] 【发布时间】:2017-09-14 17:04:30 【问题描述】:

几周前我做了一个小项目,但最近不知何故不再起作用(或者至少不像以前那样起作用)。

它必须用open() 创建一个文件,并用一些内容填充它。

[...]
int fd=open(filename, O_RDWR | O_CREAT);
/* write content */
close(fd);
[...]

问题只是它最近没有创建具有正确权限的文件(它是在问题发生时使用0110 创建的)

我现在知道我只需要像这样指定权限:

int fd=open(filename, O_RDWR | O_CREAT, 0700); /* (for instance) */

但是该项目仍然可以在某些计算机上运行(在 OSX 上无法运行,但可以在 Linux 上运行,它是使用 0640 创建的,所以它仍然可以运行,因为我仍然具有读取权限)。

所以这是我的问题:

在创建文件时如何为open() 函数定义这些默认权限?

(如果我没有明确地将它作为参数传递给我的open() 调用。)

【问题讨论】:

你的手册页告诉你什么? “[mode] 参数必须在标志中指定O_CREAT 时提供”。 (强调我的)当你不这样做时,这听起来像是未定义的行为,当我省略它时,我确实会得到垃圾(--wS--S--T)。 @ikegami 这种未定义的行为可能会导致类似this。 未定义行为的一个奇妙之处在于,有时它看起来会起作用,而在其他时候却不会。 @WumpusQ.Wumbley 确实如此。我的错,我弄乱了我的复制粘贴,我编辑了我的帖子。感谢您提请我注意。 【参考方案1】:

没有默认值。使用O_CREAT时必须指定它们。


根据我系统上的文档,

[mode] 参数必须在标志中指定O_CREAT 时提供

(强调我的)

如果你不这样做,这听起来像是未定义的行为,当我省略它时,我确实会得到垃圾 (--wS--S--T)。

【讨论】:

[open()] require an additional argument mode_t mode; the file is created with mode mode as described in chmod(2) and modified by the process' umask value (see umask(2)). 看来你是对的!我的错,我在我的男人中搜索“权限”关键字。谢谢你的回答。【参考方案2】:

您需要将模式参数指定为包含一组位标志的整数。比如:

 int fd=open(filename, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG); 

查看 chmod 的手册页。该调用还使用进程umask来限制事物。

【讨论】:

以上是关于什么是文件创建时的“open()”默认权限? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Linux默认权限超级简单计算方法

linux那个umask值是啥?

umask

Linux学习-umask详解

【umask】关于umask值及其对应的文件权限

如何在 Python 中获取默认文件权限?