2016-09-28 41 views
0

我写下面的代码,试图在Linux上使用0777模式创建一个目录:为什么我的程序不能用mkdir系统调用设置0777模式?

#include <sys/stat.h> 
#include <sys/types.h> 

int main() { 

    mkdir("/tmp/mkdir-test", 0777); 
    return 0; 

} 

但实际上,新目录有0755模式。

# stat /tmp/mkdir-test 
    File: `/tmp/mkdir-test' 
    Size: 4096  Blocks: 8   IO Block: 4096 directory 
Device: 802h/2050d Inode: 1772304  Links: 2 
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) 
Access: 2016-09-27 20:23:54.000000000 -0700 
Modify: 2016-09-27 20:23:54.000000000 -0700 
Change: 2016-09-27 20:23:54.000000000 -0700 

有人可以解释这一点吗?该程序如何创建一个真正的0777模式目录?

回答

6

在shell中运行umask;它会报告022。在创建文件或目录时,将从权限中删除umask值中设置的位。

要真正设置0777权限,您需要与umask()到丁克:

mode_t old_mask = umask(0); 
mkdir("/tmp/mkdir-test", 0777); 
umask(old_mask); 

,保留,当你确定你需要重写它除了当前设置。


顺便提及,用于设定权限另一种选择是:

const char *dirname = "/tmp/mkdir-test"; 
if (mkdir(dirname, 0777) == 0) 
    chmod(dirname, 0777); 

chmod()功能不受umask值。拨打mkdir()的权限并不重要;如果你愿意,你可以使用0。如果您试图限制权限而不是像您的情况那样放松权限,则此方法不太令人满意 - 在mkdir()chmod()调用之间存在TOCTOU(检查时间,使用时间)风格漏洞,在此期间有人可能进入一个放宽权限的目录,这可能是一个安全风险。最好使用umask()方法。 umask()是一个非常简单的系统调用,因此也非常快速(与系统调用相比,诸如open()mkdir()之类的重量级)。

+0

谢谢!有用! – walker

+0

甚至在'mkdir(3)'文档中记录了@walker。例如,Linux版本说:“新目录的文件权限位应该从'mode'初始化。**'mode'参数的这些文件权限位应该由进程'文件创建掩码**'修改(强调增加)。 –

+0

@JohnBollinger我只是试图在mkdir之后调用chmod来解决问题。它也有效。我的问题是两种方式有什么不同?哪种方式更受推荐? – walker

相关问题