yas*_*sar 8 c posix umask mkdir
我正在尝试编写一个创建目录的简单C程序(mkdir clone.).这是我到目前为止:
#include <stdlib.h>
#include <sys/stat.h> // mkdir
#include <stdio.h> // perror
mode_t getumask()
{
mode_t mask = umask(0);
umask (mask);
return mask;
}
int main(int argc, const char *argv[])
{
mode_t mask = getumask();
printf("%i",mask);
if (mkdir("trial",mask) == -1) {
perror(argv[0]);
exit(EXIT_FAILURE);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码创建了目录,d---------但我希望它drwxr-xr-x像mkdir一样创建它吗?我在这做错了什么?
编辑:这是我的工作解决方案:
int main(int argc, const char *argv[])
{
if (mkdir("trial",0777) == -1) {
perror(argv[0]);
exit(EXIT_FAILURE);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据umask设置正确的权限会自动处理.因此我只需要使用完全权限调用mkdir,并根据当前的umask进行切割.
你似乎误解了umask用途.它设置/检索进程的文件模式创建掩码,该掩码又用于关闭您在调用中指定的文件模式中的位mkdir,如下所示(pseduo-code):
real_mode = requested_mode & ~umask
Run Code Online (Sandbox Code Playgroud)
因此,在您的代码中,由于您传入了umask本身的值,因此最终将权限指定为零,这正是您所看到的.
相反,您应该在调用中指定所需的权限mkdir,如下所示:
mkdir("trial", 0755)
Run Code Online (Sandbox Code Playgroud)
正如 Eric 所说,umask 是您获得的实际权限模式的补充。mkdir()因此,您应该传递 to ,0777-mask而不是传递 mask 本身mkdir()。