创建文件时 `open()` 默认权限是什么?
What are `open()` default permissions at file creation?
几周前我做了一个小项目,但最近它不知何故不再起作用(或者至少,不像以前那样起作用)。
它必须用 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()
调用。)
没有默认值。使用 O_CREAT
.
时必须指定它们
根据我系统上的文档,
[The mode
] argument must be supplied when O_CREAT
is specified in flags
(强调我的)
当你不这样做时,这听起来像是未定义的行为,而且当我省略它时我确实得到了垃圾 (--wS--S--T
)。
您需要将模式参数指定为包含一组位标志的整数。类似于:
int fd=open(filename, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG);
请参阅 chmod 的手册页。该调用还使用进程 umask 来限制事物。
几周前我做了一个小项目,但最近它不知何故不再起作用(或者至少,不像以前那样起作用)。
它必须用 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()
调用。)
没有默认值。使用 O_CREAT
.
根据我系统上的文档,
[The
mode
] argument must be supplied whenO_CREAT
is specified in flags
(强调我的)
当你不这样做时,这听起来像是未定义的行为,而且当我省略它时我确实得到了垃圾 (--wS--S--T
)。
您需要将模式参数指定为包含一组位标志的整数。类似于:
int fd=open(filename, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG);
请参阅 chmod 的手册页。该调用还使用进程 umask 来限制事物。