ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ link(2) unlink(2)
    C,C++ & Linux 2020. 5. 18. 16:31
    728x90

    link 함수 기능

    지정한 파일의 링크파일을 만들어주는 함수입니다.

     

    Linux/Unix 는 파일마다 연결계수를 유지합니다.

    link() 함수는 파일의 하드링크 파일을 만들어주기에 해당 inode 의 연결계수가 + 1 됩니다.

     

    unlink() 함수는 반대로 해당 inode 의 연결계수를 -1 합니다.

    주의할 점은 unlink() 함수는 단순히 삭제 함수가 아니라는 것입니다.

     

    원본 파일

     

    하드링크 파일 하나 생성

    원본파일 Unlink()

    원본파일이 삭제되었지만 메모리의 연결계수는 여전히 0이 아니므로 메모리가 할당 해제되지 않습니다.

    모든 하드링크 파일 Unlink()

    unlink() 함수는 해당 파일을 삭제하고 연결계수를 -1 시키는 함수로 메모리를 삭제하지는 않습니다.

    모든 파일 및 하드링크 파일이 unlink() 되어야 메모리가 삭제되는 것이기에 unlink() 했을 때 해당 파일이 마지막 연결 계수 파일이였다면 삭제가 되는 효과를 내게 되는 것입니다.

    함수 원형

    #include <unistd.h>
    
    int link(const char *existingpath, const char *newpath);
    int unlink(const char *filepath);

    매개변수

    existingpath

    링크 파일을 만들 대상 파일의 경로

     

    newpath

    만들어질 링크 파일의 경로

     

    filepath

    unlink() 할 대상 파일의 경로

    반환값

    성공 시 0 리턴

    에러 시 -1 리턴하고 errno 설정

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int main(int argc, char *argv[]) {
        char *fname = "ssu_test.txt";
    
        // ssu_test.txt 파일의 링크파일인 my_link.txt 파일 생성
        if (link(fname, "my_link.txt") < 0) {
            fprintf(stderr, "link error\n");
            exit(1);
        }
    
        exit(0);
    }
    

    예제2

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int main(int argc, char *argv[]) {
        char *fname = "ssu_test.txt";
    
        open(fname, O_RDWR);
    
        // 파일 삭제 후 연결계수 - 1
        if (unlink(fname) < 0) {
            fprintf(stderr, "unlink error\n");
            exit(1);
        }
        printf("파일이 Unlink 되었습니다.\n");
        exit(0);
    }
    

    결과

     

    rwxrwxrwx   1   dongkyoo

    1 이 링크계수를 의미합니다.

    unlink() 했음에도 연결계수가 0이 아니므로 link.txt 파일을 통해 원본 파일에 접근할 수 있었습니다.

     

    예제3

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int main(int argc, char *argv[]) {
        char buf[64];
        char *fname = "ssu_tempfile";
        int fd;
        int length;
    
        // ssu_tempfile 을 열고
        fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0600);
    
        // 바로 삭제함
        if (unlink(fname) < 0) {
            fprintf(stderr, "unlink error\n");
            exit(1);
        }
    
        // 그 상태에서 write를 해도 잘 됨
        // 왜일까?
        if (write(fd, "How are you?", 12) != 12) {
            fprintf(stderr, "write error\n");
            exit(1);
        }
    
        // 파일 포지션을 맨 앞으로 땡겨옴
        lseek(fd, 0, SEEK_SET);
    
        // 아까 쓴 내용 다시 읽기
        // buf = "How are you?"
        if ((length = read(fd, buf, sizeof(buf))) < 0) {
            fprintf(stderr, "read error\n");
            exit(1);
        }
    
        buf[length] = '\0';
        printf("%s\n", buf);
    
        // 닫음
        // 중요!
        close(fd);
    
        // 다시 열기 시도
        if ((fd = open(fname, O_RDWR)) < 0) {
            // 하지만 삭제된 파일이기에 여는 것은 실패
            fprintf(stderr, "두 번째 Open 은 에러가 발생합니다.\n");
            exit(1);
        }
    
        close(fd);
        exit(0);
    }
    

    결과

    Linux/Unix 는 연결 계수와 별도로 참조 계수(Reference Count) 또한 관리하고 있습니다.

    참조 계수는 메인 메모리 상의 파일(Logical files)의 갯수를 말합니다.

    프로세스에서 open()을 호출한 파일이 바로 이 Logical files 입니다.

    unlink() 함수는 파일을 삭제하고 연결 계수를 -1 합니다.

    다만 파일을 삭제 할 때 참조계수가 0이 아니라면 기다렸다가 0이 되는 순간 해당 파일을 삭제하게 됩니다.

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ rename(2)  (0) 2020.05.18
    C/C++ remove(3)  (0) 2020.05.18
    하드링크, 심볼릭링크  (0) 2020.05.18
    C/C++ truncate(2) ftruncate(2)  (0) 2020.05.18
    C/C++ chown(2) fchown(2) lchown(2)  (0) 2020.05.18

    댓글

Designed by Tistory.