什么是文件创建时的“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()”默认权限? [复制]的主要内容,如果未能解决你的问题,请参考以下文章