[시스템 프로그래밍] 디렉터리와 관련된 API 및 프로그램 작성

이동욱

2021/08/31

Categories: 시스템 프로그래밍 Tags: 시스템 프로그래밍

디렉터리 내용 읽어 들이기


openddir(3)

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

DIR *opendir(const char *path);

readdir(3)

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

struct dirent *readdir(DIR *d);

closedir(3)

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

int closedir(DIR *d);

ls 명령어 만들어보기


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>

static void do_ls(char *path);

int main(int argc, char *argv[]) {
  int i;

  if (argc < 2) {
    fprintf(stderr, "%s: no argument\n", argv[0]);
    exit(1);
  }

  for (i = 1; i < argc; i++) {
    do_ls(argv[i]);
  }
  exit(0);
}

static void do_ls(char *path) {
  DIR *d;
  struct dirent *ent;

  d = opendir(path);

  if (!d) {
    perror(path);
    exit(1);
  }
  while (ent = readdir(d)) {
    printf("%s\n", ent->d_name); // 더 읽어 들일 엔트리가 없을 때까지 (즉, NULL이 반환될 때까지) 이름을 출력한다.
  }
  closedir(d);
}

디렉터리 트리의 순회


void
traverse(path) {
  DIR *d = openddir(path);
  struct dirent *ent;

  while (ent = readdir(d)) {
    if /* ent가 디렉터리이면 */ {
      traverse(path/ent);
    }
    /* 처리 */
  }
}

디렉터리 만들기


mkdir(2)

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

int mkdir(const char *path, mode_t mode);
  • ENOENT 상위 디렉터리가 없다.
  • ENOTDIR path로 지정한 상위 디렉터리가 디렉터리가 아니다.
  • EEXIST path로 지정한 경로에 이미 파일이나 디렉터리가 존재한다.
  • EPERM 상위 디렉터리에 대한 변경 권한이 없다.

umask

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

mode_t umask(mode_t mask);

mkdir 명령어 작성하기


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

int main(int argc, char *argv[]) {
  int i;

  if (argc < 2) {
    fprintf(stderr, "%s: no arguments\n", argv[0]);
    exit(1);
  }

  for (i = 1; i < argc; i++) {
    if (mkdir(argv[i], 0777) < 0) {
      perror(argv[i]);
      exit(1);
    }
  }
  exit(0);
}

디렉터리 삭제하기


rmdir(2)

#include <unistd.h>

int rmdir(const char *path);
reallinux@ubuntu:~/git/system$ clear
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  int i;
  if (argc < 2) {
    fprintf(stderr, "%s: no arguments\n", argv[0]);
    exit(1);
  }

  for (i = 1; i < argc; i++) {
    if (rmdir(argv[i]) < 0) {
      perror(argv[i]);
      exit(1);
    }
  }
}

참고 문헌

>> Home