mkdir(2)

#include <sys/stat.h>
#include <sys/types.h>

int mkdir(const char *pathname, mode_t mode);

pathname으로 새로운 디렉토리를 생성합니다. 기존에 생성된 디렉토리의 하위에 디렉토리를 생성합니다.

 

예).

b 디렉토리가 만들져 있지않은 데,  mkdir("/a/b/c", 0777);는 오류가 발생하므로  반드시 순서대로 mkdir("/a/b", 0777); mkdir("/a/b/c", 0777); 처럼 두번 호출해서 생성해야 합니다.

 

 

파라미터

pathname
    - 생성하려는 디렉토리의 상대 또는 절대 path
mode
    -생성시 설정할 디렉토리에 대한 접근권한을 설정값.

 설정값은 umask 설정값과 exclusive or 연산결과값이 설정됩니다.
 directory 접근권한 = mode & ~umask & 0777

 mode값은 아래의 상수에 대한  bit or 연산으로 설정할 수 있습니다.
 S_IRUSR : (00400) - owner에 대한 읽기 권한
 S_IWUSR : (00200) - owner에 대한 쓰기 권한
 S_IXUSR : (00100) - owner에 대한 search 권한
 S_IRGRP : (00040) - Group에 대한 읽기 권한
 S_IWGRP : (00020) - Group에 대한 쓰기 권한
 S_IXGRP : (00010) - Group에 대한 search 권한
 S_IROTH : (00004) - Other에 대한 읽기 권한
 S_IWOTH : (00002) - Other에 대한 쓰기 권한
 S_IXOTH : (00001) - Other에 대한 search 권한

 디렉토리는 X가 실행권한이 아닌 search 권한입니다.
 search 권한이라고 함은 cd 명령어로 그 디렉토리에 들어갈 수 있느냐? 

 일반적으로 3자리의 8진수로 설정합니다.
 0766 = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH : S_IXOTH

 

RETURN

0
    - 정상적으로 디렉토리가 생성되었습니다.
    

-1
    - 오류가 발생하였으며, 오류 내용은 errno 전역변수에 아래와 같이 설정됩니다. 

 EACCES : 생성하려는 부모 디렉토리에 쓰기 권한이 없음
 EDQUOT : 사용자에게 할당된 inode수 또는 disk block 등이 file system에서 고갈됨
 EEXIST : 이미 있는 디렉토리임
 EFAULT : pathname이 접속가능한 메모리가 아님
 ENAMETOOLONG : pathname이 너무 김
 ENOENT : 상위 디렉토디 등이 존재하지 않음.
 ENOSPC : disk 부족
 ENOTDIR: pathname에 디렉토리가 아닌 것이 있음
 EPERM  : pathname에 directory 생성을 지원하지 않음.
 EROFS  : read only 파일 시스템임.

 


활용 예제

 

Sample 1. directory 생성

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

if(mkdir("job_dir", 0776) == -1 && errno != EEXIST) {
    fprintf(stderr, "%s directory create error: %s\n", strerror(errno));
    return -1;
} 

 

Sample 2. Java의 File.mkdirs( )와 비슷한 2 depth 이상의 디렉토리를 한번에 만드는 함수

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

int mkdirs(const char *path, mode_t mode)
{
    char tmp_path[2048];
    const char *tmp = path;
    int  len  = 0;
    int  ret;

    if(path == NULL || strlen(path) >= 2048) {
        return -1;
    }

    while((tmp = strchr(tmp, '/')) != NULL) {
        len = tmp - path;
        tmp++;

        if(len == 0) {
            continue;
        }
        strncpy(tmp_path, path, len);
        tmp_path[len] = 0x00;

        if((ret = mkdir(tmp_path, mode)) == -1) {
            if(errno != EEXIST) {
                return -1;
            }
        }
    }

    return mkdir(path, mode);
}

int main()
{
    return mkdirs("./src/temp", 0776);
}

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요