반응형
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);
}
반응형
'C언어 header > sys | stat.h' 카테고리의 다른 글
umask(2) - 파일 및 디렉토리의 생성권한을 통제하는 mask값 설정 (0) | 2019.09.29 |
---|---|
fchmod(2) - 파일의 접근 권한(permission) 변경 (0) | 2019.09.29 |
chmod(2) - 파일의 접근 권한(permission) 변경 (0) | 2019.09.29 |