C 文件创建时的“open()”默认权限是什么?

C 文件创建时的“open()”默认权限是什么?,c,file-permissions,C,File Permissions,几周前我做了一个小项目,但最近不知怎么的它不再工作了(或者至少不像以前那样工作了) 它必须用open()创建一个文件,并用一些内容填充它 [...] int fd=open(filename, O_RDWR | O_CREAT); /* write content */ close(fd); [...] 问题只是它最近没有再创建具有正确权限的文件(它是在问题发生时使用0110创建的) 现在我知道我只需要指定如下权限: int fd=open(filename, O_RDWR | O_CREAT

几周前我做了一个小项目,但最近不知怎么的它不再工作了(或者至少不像以前那样工作了)

它必须用
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\u create
时必须指定它们


根据我系统上的文档


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

(强调矿山)


这使它听起来像是未定义的行为,而当我忽略它时,我确实会得到垃圾(
--wS--s--t
)。

没有默认值。使用
O\u create
时必须指定它们


根据我系统上的文档


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

(强调矿山)


这使它听起来像是未定义的行为,而当我忽略它时,我确实会得到垃圾(
--wS--s--t
)。

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

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

有关chmod,请参见手册页。调用还使用进程umask进行限制。

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

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

有关chmod,请参见手册页。调用还使用进程umask来限制内容。

您的手册页面告诉您什么?“[当在标志中指定了
O_create
时,必须提供
mode
]参数”。(强调我的)这听起来像是未定义的行为,而当你不这样做的时候,我确实得到了垃圾,当我忽略它(
--wS--s--t
)。@ikegami,未定义的行为可能会导致类似的结果。未定义行为的一个奇迹是,有时它似乎会起作用,而在其他时候,不会的。@WumpusQ.Wumbley真的。我的错,我弄乱了我的复制粘贴,我编辑了我的帖子。感谢您提醒我注意这一点。您的手册页面告诉了您什么?“[当标志中指定了
O_create
时,必须提供
mode
]参数”。(强调我的)这听起来像是未定义的行为,而当你不这样做的时候,我确实得到了垃圾,当我忽略它(
--wS--s--t
)。@ikegami,未定义的行为可能会导致类似的结果。未定义行为的一个奇迹是,有时它似乎会起作用,而在其他时候,不会的。@WumpusQ.Wumbley真的。我的错,我弄乱了我的复制粘贴,我编辑了我的帖子。感谢您提醒我这一点。
[open()]需要额外的参数模式\u t模式;该文件是使用chmod(2)中描述的模式创建的,并由进程的umask值(请参见umask(2))进行修改。
看起来您是对的!糟糕的是,我在我的男人身上搜索“权限”关键字。感谢您的回答。
[open()]需要额外的参数模式\u t模式;该文件是使用chmod(2)中描述的模式创建的,并由进程的umask值(请参见umask(2))进行修改。
看起来您是对的!糟糕的是,我在我的男人身上搜索“权限”关键字。谢谢你的回答。