创建文件时 `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() 调用。)

没有默认值。使用 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 来限制事物。