C言語システムコール-mkdir

mkdirシステムコール

概要

mkdirは指定パスにディレクトリを作成します。


作成するディレクトリの親ディレクトリは存在している必要があります。

存在しないフルパスでディレクトリを作成する場合には再帰処理で各ディレクトリを作成する必要があります。


引数としてディレクトリのパーミッションを指定しますが、プロセスのumask値でマスクされます。


サンプルプログラム

c言語 mkdirシステムコールでディレクトリ階層を作成します。


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

static int
stat_mkdir(const char *filepath, mode_t mode)
{
    struct stat sb = {0};
    int rc = 0;

    rc = stat(filepath, &sb);
    if(rc == 0){
        if(!S_ISDIR(sb.st_mode)){
            printf("Error: Not a directory: %s\n", filepath);
            return(-1);
        }
        return(0);
    }

    rc = mkdir(filepath, mode);
    if(rc < 0){
       printf("Error: mkdir(%d) %s: %s\n",
                errno, strerror(errno), filepath);
        return(-1);
    }

    return(0);
}

static int
mkdir_path(const char *filepath, mode_t mode)
{
   char *p = NULL;
    char *buf = NULL;
    int rc = 0;

    /* バッファに文字列を移し替える */
    buf = (char *)malloc(strlen(filepath) + 4);
    if(buf == NULL){
        printf("Error: malloc(%d) %s\n", errno, strerror(errno));
        return(-1);
    }
    strcpy(buf, filepath);

    /* 先頭からシークしてディレクトリを作成する */
    for(p=strchr(buf+1, '/'); p; p=strchr(p+1, '/')){
        *p = '¥0';
        rc = stat_mkdir(buf, mode);
        if(rc != 0){
            free(buf);
            return(-1);
        }
        *p = '/';
    }

    free(buf);
    return(0);
}

int
main(void)
{
    int rc = 0;

    rc = mkdir_path("./tmp/test/test1/test2/", 0777);
    if(rc < 0) return(-1);

    return(0);
}

関連ページ