我有一部分代码
if(mkdir(name, 0666/*permission*/) == -1)
{
printf("ERROR");
return ERROR;
}
新创建的目录看起来像
drw-rw-r-- 2 atg atg 4096 Oct 3 17:54 f,,,
但我希望它拥有其他人的写权限,即drw-rw-rw-
。
当我尝试使用cd
进入目录时,我得到了
bash:cd:f:权限被拒绝
如果我使用执行权限创建它,如下所示:
if(mkdir(name, 0777/*permission*/) == -1)
{
printf("ERROR");
return ERROR;
}
我得到了
drwxrwxr-x 2 atg atg 4096 Oct 3 18:00 f
我可以使用cd
输入目录。
使用
if(mkdir(name, 0777/*permission*/) == -1)
{
printf("ERROR");
return ERROR;
}
我得到了
dr-xr-xr-x 2 atg atg 4096 Oct 3 18:02 f
为什么没有设置写权限?
我用chmod作为
case RD_WRT_DATA:
permission = 0666;
break;
if(mkdir(name, permission) == -1)
{
printf("ERROR");
return ERROR;
}
else
{
return SUCCESS;
}
if(chmod(name, permission) == -1)
{
printf("ERROR");
return ERROR;
}
else
{
return SUCCESS;
}
检查了umask:
grep UMASK /etc/login.defs
UMASK 022
仍然是我得到的权限是 - >
drw-rw-r-- 2 atg atg 4096 Oct 3 18:15 f
我应该更换umask吗?没有那样做是否有任何改变?
答案 0 :(得分:2)
无法列出没有可执行权限的目录。
除了设置umask(0)
之外,还可以使用模式0777
创建目录。
答案 1 :(得分:2)
进程的umask
值掩盖了非所有者的写入权限。见https://en.wikipedia.org/wiki/Umask:
在计算中,umask是一个确定a的设置的命令 掩码,用于控制如何为新创建的文件权限设置 文件。它也可以指一个设置掩码的函数,或者它可能 引用掩码本身,正式称为文件模式 创作面具。掩码是一组位,每个位都受到限制 如何为新创建的文件设置相应的权限。
umask值是进程的全局值。因此,调用umask()
将影响流程中运行的所有线程,以及更改值后生成的所有子进程。
要安全地确保文件或目录权限而不影响流程的其余部分,您需要使用chmod()
显式设置权限:
int rc;
mode_t mode = 0777;
rc = mkdir( name, mode );
if ( 0 == rc )
{
rc = chmod( name, mode );
}
.
.
.
如果您真的想要更改umask()
,最好将其设置为您需要的内容,然后将其恢复:
mode_t old_mask = umask( 0 );
int rc = mkdir( name, 0777 );
umask( old_mask );
答案 2 :(得分:0)
尝试拨打
umask(0);
<{1>}之前的,因为mkdir
会对新创建的目录的权限产生影响。
答案 3 :(得分:0)
大多数Linux发行版使用默认umask = 022
。这意味着当您使用权限mkdir
呼叫777
时,您将获得权限:777(asked) - 022(umask) = 0755(actual)
。实际上,umask
应该从新创建的文件/目录中删除哪些权限,其中每个八进制数字表示:
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : nothing
制作umask(0)
,您将在创建的目录上收到777
的权限。