link(2)

#include <unistd.h>

int link(const char *oldpath, const char *newpath);

존재하고 있는 파일에 대해 hard link를 생성합니다. hard link는 실제 파일의 저장 위치는 공유하고, meta정보만 추가되고 hard link count만 증가합니다. 파일의 저장된 데이터는 unlink(2)로 삭제를 하면, hard link count가 0이 되면 삭제됩니다.

 

hard link와 symbolic link의 차이

1. hard link는 symbolic link와 달리 어떤 것이 원본인 지 구별할 수 없습니다.
   - hard link가 만들어지는 순간 구분을 할 수 없습니다.
2. hard link는 파일만 가능하고 directory는 hard link를 생성할 수 없습니다.
3. hard link는 실제로 존재하는 파일이어야 합니다.
4. hard link는 동일한 inode를 갖습니다.
5. hard link는 동일한 disk mount에서만 가능합니다.

 

hard link count는 ls -al 명령어로 확인 가능합니다.

ls -al 했을 때, 2번째 항목입니다. (directory는 hard link count와 관계없음)

권한        link수  사용자   그룹    크기 날짜         파일명
drwx------.  32     user1    group1 4096  Aug  5 2018  .
drwx------.   3     user1    group1 4096  Aug  5 2018  ..
-rw-r--r--.   1     user1    group1  201  Aug  5 2018  test.c

 

파라미터

oldpath
    - hard link를 생성하려는 원본 파일명
    - 존재하는 파일이어야 합니다.
newpath
    - 새로 생성할 파일명

 

RETURN

0
    - 정상적으로 hard link가 생성되었습니다.

-1
    - 오류가 발생하였으며, 상세한 오류는 errno 전역변수에  설정됩니다.

 EACCES : newpath를 생성할 디렉토리에 권한이 없거나, oldpath 또는 newpath에 search 권한이 없음.
 EDQUOT : user에 할당된 disk block이 다 소모되었습니다.
 EEXIST : newpath가 이미 존재합니다.
 EFAULT : oldpath 또는 newpath 변수의 데이터 버퍼가 접근가능한 메모리 영역이 아닙니다.
 EIO    : I/O error가 발생하였습니다.
 ELOOP  : oldpath 또는 newpath가 symbolic links의 depth가 너무 깊어서 처리하지 못합니다.
 EMLINK : oldpath가 이미 최대 hard link 개수입니다.
 ENAMETOOLONG : oldpath 또는 newpath의 문자열이 너무 깁니다.
 ENOENT : oldpath 또는 newpath의 디렉토리 구성에 없는 디렉토리가 있습니다.
 ENOMEM : kernel memory가 부족합니다.
 ENOSPC : 파일을 가지고 있는 device의 새로운 디렉토리 entry를 저장할 공간이 없습니다.
 ENOTDIR : oldpath 또는 newpath의 구성 디렉토리가 디렉토리가 아닙니다.
 EPERM  :  oldpath가 디렉토리입니다.
 EPERM : oldpath나 newpath를 포함하는 file system이 hard link를 지원하지 않습니다.
 EROFS  : read-only file system입니다.
 EXDEV : oldpath와 newpath는 같은 mount file system이 있지 않습니다.

 


see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요