바로가기 아이콘을 만드는 것처럼 UNIX 파일은, 물리적 집합은 중복해서 메모리에 저장되어 있지 않아도 여러 경로이름과 연관될 수 있다.

이러한 것들의 각 이름은 하나의 하드링크라고 하고, 한 파일과 연관된 링크의 수는 그 파일의 링크 계수라고 부른다.

경로이름은 다르게, 아이노드 번호는 같게! (원본 파일의 아이노드 번호를 참조한당 :D)


link 시스템 호출


#include <unistd.h>


int link(const char *orginal_path, const char *new_path);


새 하드링크는 link 시스템 호출로 생성할 수 있다.

첫 번째 인수는 기존 파일 이름의 문자형 포인터이다.

두 번째 인수는 그 파일에 대한 새로운 이름 또는 링크를 가리킨다. new_path는 이미 존재하는 파일이 아니여야한다!


새로운 링크 생성이 성공하면 link 시스템 호출은 0을 반환하고, 오류가 발생하면 -1을 반환한다.


link("/tmp/one/orginal_myfile", "/tmp/two/new_myfile");


link 호출에는 두 가지 중요한 제한이 있는데, 다음과 같다.

  • 디렉토리는 참조할 수 없다.
  • 다른 파일 시스템에 있는 파일을 참조할 수 없다.


앞서 파일을 제거하는 방법 중 하나로 unlink 시스템 호출이 있었다.

unlink 호출은 지명된 링크를 제거하고, 파일의 링크 계수를 하나 줄인다.

만약 링크 계수가 0이되고, 그 파일을 개방한 프로그램이 하나도 없으면, 파일은 시스템으로부터 제거된 것이다!



symlink 시스템 호출


#include <unistd.h>


int symlink(const char *realname, const char *symname);


앞서 link의 두 가지 제한을 보았다. 심볼릭 링크는 특수한 파일의 종류로, 그 내용물인 문자열이 링크가 가리키는 또 다른 파일의 경로이름이다.

link 호출을 이용하면 아이노드 블록을 같이 참조하지만, symlink는 자신만의 아이노드 블록을 가지며, 데이터 블록이 원본 파일 경로를 가리키고 있다.

즉, 심볼릭 링크는 다른 파일에 대한 포인터라고 할 수 있다.



readlink 시스템 호출


#include <unistd.h>


int readlink(const char *sympath, char *buffer, size_t bufsize);


만약 심볼릭 링크 파일이 open으로 개방되면, open 시스템 호출은 심볼릭 링크 파일이 가리키는 파일의 파일 기술자를 반환한다.

readlink는 링크를 따라가지 않고 심볼릭 링크 자체에서 동작하는 시스템 호출이다.

만일 한 프로그래머가 심볼릭 링크 자체에 들어있는 자료를 보고 싶으면 반드시 readlink를 사용해야 한다.


readlink 시스템 호출은 먼저 sympath를 개방하고, 그 파일 내용을 buffer로 읽어 들인다.

반환 값은 버퍼 내의 문자 수를 나타내거나 오류 발생시 -1이다.

심볼릭 링크에 의해 가리켜지고 있는 원래의 파일이 제거되었는데, 그 파일을 이 심볼릭 링크를 통해 접근하려고 하면 오류가 발생한다.



rename 시스템 호출


rename 시스템 호출은 정규 파일, 디렉토리의 이름을 바꾸는 것이다.


#include <stdio.h>


int rename(const char *old_pathname, const char *new_pathname);


첫 번째 인수 old_pathname이 두 번째 인수 new_pathname으로 개명된다.

만약 new_pathname이 이미 존재하면 이를 먼저 제거한 후 old_pathname을 개명한다!


'개발 > System' 카테고리의 다른 글

UNIX의 디렉토리  (0) 2012.10.29
파일 정보의 획득  (0) 2012.10.29
access, chmod, chown 시스템 호출  (0) 2012.10.29
다중 사용자 환경에서의 파일  (0) 2012.10.28
리눅스의 파일 시스템  (0) 2012.10.28

+ Recent posts