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