리눅스 링크 파일에 대해 알아보자!

funky·2023년 10월 24일
0
post-thumbnail
post-custom-banner

링크

먼저 링크란, 이미 있는 파일이나 디렉터리에 접근할 수 있는 새로운 이름을 의미한다.
같은 파일이나 디렉터리지만 여러 이름으로 접근할 수 있게 하는 것인데,

윈도우의 바로가기 같은 .. 느낌이라 볼 수 있겠다 ~

하드 링크와 심볼릭 링크가 있다.
하드 링크부터 알아보자 고고씽 ~ 🚗


하드 링크 - inode 동일!

하드링크는 파일에 접근할 수 있는 파일명을 새로 생성하는 것으로
기존 파일과 동일한 inode를 사용한다 !

  • 하드 링크 생성 시 inode에 저장된 링크 개수가 증가한다. (당연함)

#include <unisstd.h>

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

link()는 기존 파일의 경로를 첫 번째 인자인 oldpath
새로 생성할 하드 링크 파일의 경로인 newpath를 두 번째 인자로 받는다.

하드 링크는 같은 파일 시스템에 있어야 하므로 두 경로를 반드시!! 같은 파일 시스템으로 지정해야한다.

  • link 함수는 수행에 성공하면 0을, 실패하면 -1을 리턴한다 !

//link()로 하드 링크 생성하는 코드

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

int main(){
	struct stat statbuf;
    
    stat("linux.txt", &statbuf);
    printf("Before Link Count = %d\n", (int)statbuf.st_nlink);
    
    link("linux.txt", "linuxln");
    
    stat("linux.txt", &statbuf);
    printf("After Link Count = %d\n", (int)statbuf.st_nlink);
}
  • 실행 결과


심벌릭 링크 - 다른 inode 사용!

심벌릭 링크는 기존 파일에 접근할 수 있는 다른 파일을 만든다.
기존 파일과 다른 inode를 사용하며, 기존 파일의 경로를 저장한다.

  • 생성은 symlink()
  • 심벌릭 링크의 정보 검색은 stat()이 아니라 lstat()를 사용하며
  • 심벌릭 링크 자체가 담고 있는 내용은 readlink() 함수로 읽을 수 있다.

#include <unistd.h>

int symlink(const char *target, const char *linkpath);

기존 파일의 경로를 첫 번째 인자인 target 으로 받고,
새로 생성할 심벌릭 링크의 경로를 두 번째 인자인 linkpath로 받는다.

심벌릭 링크는 하드 링크와 다르게 기존 파일과 다른 파일 시스템에도 생성할 수 있다.

  • 수행에 성공하면 0을, 실패하면 -1을 반환한다.
#include <unistd.h>

int main() {
	symlink("linux.txt", "linux.sym");
}

심벌릭 링크의 정보 검색 : lstat()

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

int lstat(const char *pathname, struct stat *statbuf);

lstat()는 심벌릭 링크 자체의 파일 정보를 검색한다.

주의할 점: 심벌릭 링크를 stat()로 검색하면 원본 파일에 대한 정보가 검색된다!
심벌릭 링크 자체의 파일 정보 검색하려면 lstat() 사용해야함


#include <unistd.h>

ssize_t readlink(const char *pathname, char *buf,size_t bufsiz);
//pathname - 심벌릭 링크의 경로
//buf - 읽어온 내용을 저장할 버퍼
//bufsiz - 버퍼의 크기

vi로 심벌릭 링크를 열면 원본 파일이 열린다.

readlink()를 사용하면 심벌릭 링크 자체의 데이터를 읽을 수 있는데
심벌릭 링크의 경로를 받아 해당 파일의 내용을 읽는다.

  • 수행에 성공하면 읽어온 데이터의 크기(바이트 수)를, 실패하면 -1을 리턴한다.

//readlink()함수를 사용하여 심벌릭 링크의 내용을 읽어보자!

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

int main() {
	char buf[BUFSIZ];
    int n;
    
    n = readlink("linux.sym", buf, BUFSIZ);
    if (n == -1){
    	perror("readlink");
        exit(1);
    }
    buf[n] = '\0'; //buf 끝에 Null을 추가
    printf("linux.sym : READLINK = %s\n", buf); 
}
  • 실행결과
심벌릭 링크의 크기는 'linux.txt' 의 바이트 수인 9임을 알 수 있다!

심벌릭 링크의 원본 파일 경로 읽기 : realpath(3)

#include <limits.h>
#include <stdlib.h>

char *realpath(const char *path, char *resolved_path);

//path: 심벌릭 링크의 경로명
//resolved_path: 경로명을 저장할 버퍼 주소

심벌릭 링크가 가리키는 원본 파일의 실제 경로명realpath() 함수로 확인한다.
심벌릭 링크명을 받아 실제 경로명을 resolved_path 에 저장하는데,

  • 성공하면 실제 경로명이 저장된 곳의 주소를, 실패하면 null 포인터를 리턴한다.
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>

int main(){
	char buf[BUFSIZ];
    
    realpath("linux.sym", buf);
    printf("linux.sym : REALPATH = %s\n", buf)
}
// 실행 결과
// linux.sym : REALPATH = /home/fk/src/ch3/linux.txt

#include <unistd.h>

int unlink(const char *pathname);

//pathname: 삭제할 링크의 경로
  • unlink()에서 연결을 끊은 경로 명이 그 파일을 참조하는 마지막 링크라면

    파일은 삭제된다!

  • 만약, 인자로 지정한 경로명이 심벌릭 링크

    링크가 가리키는 원본 파일이 아니라 심벌릭 링크 파일 이 삭제 된다!

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

int main(){
	struct stat statbuf;
    
    stat("linux.ln", &statbuf);
    printf("1. linux.ln : Link Count = %d\n", (int)statbuf.st_nlink);
    
    unlink("linux.ln"); // 하드링크 삭제 
    
    stat("linux.txt", &statbuf);
    printf("2. linux.txt : Link Count = %d\n", (int)statbuf.st_nlink);
	
    unlink("linux.sym"); // 심벌릭링크 삭제
}
  • 실행 결과


profile
living Fun & Lucky
post-custom-banner

0개의 댓글