[시스템 프로그래밍] 파일 메타 정보 확인 및 수정하기

이동욱

2021/09/05

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

메타 정보 획득하기


stat(2)

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

int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);

stat 명령어 만들기

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

static char *filetype(mode_t mode);

int main(int argc, char *argv[]) {
  struct stat st;

  if (argc != 2) {
    fprintf(stderr, "wrong argument\n");
    exit(1);
  }

  if (lstat(argv[1], &st) < 0) {
    perror(argv[1]);
    exit(1);
  }

  printf("type\t%o (%s)\n", (st.st_mode & S_IFMT), filetype(st.st_mode));
  printf("mode\t%o\n", st.st_mode & ~S_IFMT);
  printf("dev\t%llu\n", (unsigned long long)st.st_dev);
  printf("ino\t%lu\n", (unsigned long)st.st_ino);
  printf("rdev\t%lu\n", (unsigned long)st.st_rdev);
  printf("nlink\t%lu\n", (unsigned long)st.st_nlink);
  printf("uid\t%d\n", st.st_uid);
  printf("gid\t%d\n", st.st_gid);
  printf("size\t%ld\n", st.st_size);
  printf("blksize\t%ld\n", (unsigned long)st.st_blksize);
  printf("blocks\t%lu\n", (unsigned long)st.st_blocks);
  printf("atime\t%s", ctime(&st.st_atime));
  printf("mtime\t%s", ctime(&st.st_mtime));
  printf("ctime\t%s", ctime(&st.st_ctime));

  exit(0);
}

static char *filetype(mode_t mode) {
  if (S_ISREG(mode)) return "file";
  if (S_ISDIR(mode)) return "directory";
  if (S_ISCHR(mode)) return "chardev";
  if (S_ISBLK(mode)) return "blockdev";
  if (S_ISFIFO(mode)) return "fifo";
  if (S_ISLNK(mode)) return "symlink";
  if (S_ISSOCK(mode)) return "socket";
  return "unknown";
}

메타 정보 변경하기

변경 대상 사용하는 시스템 콜
권한 chmod(2)
오너와 그룹 chown (2)
최종 액세스 시간과 최종 갱신 시각 utime(2)

chmod(2)

#include <sys/stat.h>

int chmod(const char *path, mode_t mode);

chown(2)

#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);

utime(2)

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

int utime(const char *path, struct utimbuf *buf);

struct utimbuf {
  time_t actime; /* 최종 액세스 시간 */
  time_t modetime; /* 최종 갱신 시간 */
}

chmod 명령어 작성하기

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

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

  if (argc < 2) {
    fprintf(stderr, "no mode given\n");
    exit(1);
  }

  mode = strtol(argv[1], NULL, 0);
  for (i = 2; i < argc; i++) {
    if (chmod(argv[i], mode) < 0) {
      perror(argv[i]);
    }
  }
  exit(0);
}

참고 문헌

>> Home