2017-04-18 132 views
0

几个星期前我做了一个小项目,但最近不知何故(或者至少不像之前的工作)。什么是创建文件时的`open()`默认权限?

它必须创建一个文件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()作为参数。)

+1

你的手册页告诉你什么? – Jens

+2

“[在标志中指定'O_CREAT'时,必须提供''mode']参数*。 (强调我的)这使得它听起来像是不确定的行为,而当我忽略它时('--wS - S - T'),我确实会变成垃圾。 – ikegami

+0

@ikegami而这种未定义的行为可能会导致类似[this](http://stackoverflow.com/q/2245193/6850771)。 –

回答

4

没有默认。当您使用O_CREAT时,您必须指定它们。


根据我的系统中的文档,

时在标志中指定O_CREAT

(重点煤矿)[本mode]参数必须供给

这使得它听起来像是当你不知道时它的未定义行为当我省略它时(--wS--S--T),我确实会变成垃圾。

+0

'[open()]需要额外的参数mode_t mode;通过进程的umask值(请参阅umask(2))。' 它看起来像你说得对输入chmod(2)描述和修改的文件与模式模式创建!我的不好,我在我的男人搜索“权限”关键字。 谢谢你的回答。 – vmonteco

0

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

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

请参阅chmod的手册页。该调用还使用进程umask来限制事情。