来自系统调用creat的奇怪行为

时间:2011-05-13 09:06:18

标签: c++ c unix system-calls

我正在创建一个文件,如下所示

 int fd  = creat(file_path.c_str() ,S_IRWXU|S_IRWXG|S_IRWXO);

虽然我向所有三个实体提供所有权限,但它会创建具有以下权限的文件。

-rwxr-xr-x

我创建此目录的目录的权限设置为

drwxrwxrwx

Umask

0022

你们可以建议可能出现的问题吗?

编辑:我可以chmod该文件,为其提供我计划的权限。我很好奇上面的原因是失败了。

4 个答案:

答案 0 :(得分:4)

你自己说,你有一个022的umask,所以省略了写权限;来自creat手册页:

  

进程的umask以通常的方式修改有效权限:创建的文件的权限是(mode& ~umask)。

答案 1 :(得分:3)

您可能在umask限制下运行

man umask

应该让你走上正确的轨道

答案 2 :(得分:3)

umask与您在creat调用中以此方式file_perms & ~umask指定的文件权限相结合,以获得实际为文件设置的权限位。 umask基本上指定了即使您请求设置它们也不应设置哪些位。

chmod调用忽略umask。你的目录权限在这里是无关紧要的(好吧,并非完全不相关,如果你没有对你正在创建文件的目录的写权限,它将完全失败。)

答案 3 :(得分:1)

umask中的权限从模式参数关闭到openmkdir(以及creat和朋友,类似)。例如,如果mode参数指定为:

S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH(0666)创建典型umask为0022的文件时,结果为

S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH(0644)

因此,您正确地看到没有为您正在创建的目录提供写访问权。