weixin_52884284 2022-07-25 17:38 采纳率: 100%
浏览 52
已结题

linux的mkdir命令编写疑问

#include <stdio.h>
#include <sys/types.h> /umask、stat/
#include <sys/stat.h> /chmod/
#include <unistd.h>
#include <err.h>
#include <errno.h>
#include <libgen.h> /dirname/
#include <stdlib.h>
#include <string.h>

/*
int mkdir(const char *pathname, mode_t mode);
mode方式:
S_IRWXU 00700权限,代表该文件所有者拥有读,写和执行操作的权限
S_IRUSR(S_IREAD) 00400权限,代表该文件所有者拥有可读的权限
S_IWUSR(S_IWRITE) 00200权限,代表该文件所有者拥有可写的权限
S_IXUSR(S_IEXEC) 00100权限,代表该文件所有者拥有执行的权限
S_IRWXG 00070权限,代表该文件用户组拥有读,写和执行操作的权限
S_IRGRP 00040权限,代表该文件用户组拥有可读的权限
S_IWGRP 00020权限,代表该文件用户组拥有可写的权限
S_IXGRP 00010权限,代表该文件用户组拥有执行的权限
S_IRWXO 00007权限,代表其他用户拥有读,写和执行操作的权限
S_IROTH 00004权限,代表其他用户拥有可读的权限
S_IWOTH 00002权限,代表其他用户拥有可写的权限
S_IXOTH 00001权限,代表其他用户拥有执行的权限

*/

/*
参数 mode 有下列数种组合:
S_ISUID 04000 文件的 (set user-id on execution)位
S_ISGID 02000 文件的 (set group-id on execution)位
S_ISVTX 01000 文件的sticky 位
S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限

*/

static int vflag;

static void usage(void)
{
(void)fprintf(stderr,"usage: mkdir [-pv] [-m mode] directory_name ...\n");
}

/*
*对于一个a/b/c这样的一个多级目录,要想实现父目录的创建方法,
可以进行字符串处理分出一级一级目录.

  • 成功完成后,mkdir() 应返回 0。否则,应返回 -1,不应创建目录,并应设置 errno 以指示错误。
  • /

static int create_directory(char *path, mode_t omode)
{
struct stat sb;
mode_t numask, oumask;
int first, last, retval;
char p;
/检查我们是否需要对中间目录做任何事情/
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /
Skip '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
last = 1;
else if (p[0] != '/')
continue;
p = '\0';
if (!last && p[1] == '\0')
last = 1;
if (first) {
oumask = umask(0);
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
/

判断该文件或目录是否否存在 ;得到st_mode,然后判断是不是目录文件。
成功判断返回的st_mode是否是一个文件夹。
*/
if (stat(path, &sb) < 0) {
warn("%s", path);
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
if (last)
errno = EEXIST;
else
errno = ENOTDIR;
warn("%s", path);
retval = 0;
break;
}
if (last)
retval = 2;
} else {
warn("%s", path);
retval = 0;
break;
}
} else if (vflag)
printf("%s\n", path);
if (!last)
*p = '/';
}
if (!first && !last)
(void)umask(oumask);
return (retval);
}

int main(int argc, char *argv[])
{
int ch, exitval, success, pflag;
mode_t omode;
void *set = NULL;
char *mode;

omode = pflag = 0;
mode = NULL;
while ((ch = getopt(argc, argv, "m:pv")) != -1)
    switch(ch) {
    case 'm':
        mode = optarg;
        break;
    case 'p':
        pflag = 1;
        break;
    case 'v':
        vflag = 1;
        break;
    case '?':
    default:
        usage();
    }

argc -= optind;
argv += optind;
if (argv[0] == NULL)
    usage();

if (mode == NULL) {
    omode = S_IRWXU | S_IRWXG | S_IRWXO;
}

for (exitval = 0; *argv != NULL; ++argv) {
    if (pflag) {
        success = create_directory(*argv, omode);
    } else if (mkdir(*argv, omode) < 0) {
        if (errno == ENOTDIR || errno == ENOENT)
            warn("%s", dirname(*argv));
        else
            warn("%s", *argv);
        success = 0;
    } else {
        success = 1;
        if (vflag)
            (void)printf("%s\n", *argv);
    }
    if (!success)
        exitval = 1;
    /*
     chmod()会依参数mode 权限来更改参数path 指定文件的权限。
     */
    if (success == 1 && mode != NULL && chmod(*argv, omode) == -1) {
        warn("%s", *argv);
        exitval = 1;
    }
}
return (exitval);

}

这是个mkdir命令的代码,为什么这里mode为空判断时只设置了默认权限,mode不为空时不应该还有个omode=mode吗?
if (mode == NULL) {
omode = S_IRWXU | S_IRWXG | S_IRWXO;
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 8月2日
    • 创建了问题 7月25日

    悬赏问题

    • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
    • ¥20 网站后台使用极速模式非常的卡
    • ¥20 Keil uVision5创建project没反应
    • ¥15 mmseqs内存报错
    • ¥15 vika文档如何与obsidian同步
    • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
    • ¥15 陆空双模式无人机飞控设置
    • ¥15 sentaurus lithography
    • ¥100 求抖音ck号 或者提ck教程
    • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)