[시스템 프로그래밍] 하드 링크 및 심볼릭 링크

이동욱

2021/09/03

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

하드 링크


echo 'this is a file.' > a

ln a b
rm -f a b

link(2)

#include <unistd.h>

int link(const char *src, const char *dest);
  • srcdest에는 동일한 파일 시스템에 있어야 한다. 양쪽 모두가 하나의 파일 시스템에 존재해야 한다.
  • srcdest에 디렉터리는 사용할 수 없다. 즉, 디렉터리에 하드 링크를 붙일 수 없다. 이 제한은 나중에 언급할 심볼릭 링크를 사용하여 해결할 수 있다.

ln 명령어 작성하기

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  if (argc != 3) {
    fprintf(stderr, "%s: wrong arguments\n", argv[0]);
    exit(1);
  }

  if (link(argv[1], argv[2]) < 0) {
    perror(argv[1]);
    exit(1);
  }
  exit(0);
}

심볼릭 링크


  • 심볼릭 링크에는 대응하는 실체가 존재하지 않아도 된다. 심볼릭 링크는 실제로 액세스 할 때가 아니면 이름의 실체의 맵핑을 하지 않기 때문에 실체가 없어도 만들 수 있다.
  • 파일 시스템의 경계를 뛰어넘어서 별명을 붙일 수 있다. 하드 링크는 하나의 파일 시스템 내에서만 만들 수 있다는 제약이 있었다. 그러나 심볼릭 링크는 파일 시스템의 경계와 관계없이 만들 수 있다.
  • 디렉터리에도 별명을 붙일 수 있다. 디렉터리에 대해서는 하드 링크는 만들 수 없지만 심볼릭 링크는 만들 수 있따.

symlink(2)

#include <unistd.h>

int symlink(const char *src, const char *dest);

readlink(2)

#include <unistd.h>

int readlink(const char *path, char *buf, size_t bufsize);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  if (argc != 3) {
    fprintf(stderr, "%s: wrong number of arguments\n", argv[0]);
    exit(1);
  }

  if (symlink(argv[1], argv[2]) < 0) {
    perror(argv[1]);
    exit(1);
  }
  exit(0);
}

참고 문헌

>> Home