먼저 링크란, 이미 있는 파일이나 디렉터리에 접근할 수 있는 새로운 이름
을 의미한다.
같은 파일이나 디렉터리지만 여러 이름
으로 접근할 수 있게 하는 것인데,
윈도우의 바로가기 같은 .. 느낌이라 볼 수 있겠다 ~
하드 링크와 심볼릭 링크가 있다.
하드 링크부터 알아보자 고고씽 ~ 🚗
하드링크는 파일에 접근할 수 있는 파일명을 새로 생성하는 것으로
기존 파일과 동일한 inode를 사용한다 !
#include <unisstd.h>
int link(const char *oldpath, const char *newpath);
link()는 기존 파일의 경로를 첫 번째 인자인 oldpath
와
새로 생성할 하드 링크 파일의 경로인 newpath
를 두 번째 인자로 받는다.
하드 링크는 같은 파일 시스템에 있어야 하므로 두 경로를 반드시!! 같은 파일 시스템으로 지정해야한다.
성공하면 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를 사용하며, 기존 파일의 경로를 저장한다.
#include <unistd.h>
int symlink(const char *target, const char *linkpath);
기존 파일의 경로를 첫 번째 인자인 target
으로 받고,
새로 생성할 심벌릭 링크의 경로를 두 번째 인자인 linkpath
로 받는다.
심벌릭 링크는 하드 링크와 다르게 기존 파일과 다른 파일 시스템에도 생성할 수 있다.
#include <unistd.h>
int main() {
symlink("linux.txt", "linux.sym");
}
#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()
를 사용하면 심벌릭 링크 자체의 데이터를 읽을 수 있는데
심벌릭 링크의 경로를 받아 해당 파일의 내용을 읽는다.
//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임을 알 수 있다!
#include <limits.h>
#include <stdlib.h>
char *realpath(const char *path, char *resolved_path);
//path: 심벌릭 링크의 경로명
//resolved_path: 경로명을 저장할 버퍼 주소
심벌릭 링크가 가리키는 원본 파일의 실제 경로명은 realpath()
함수로 확인한다.
심벌릭 링크명을 받아 실제 경로명을 resolved_path 에 저장하는데,
#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: 삭제할 링크의 경로
파일은 삭제된다!
링크가 가리키는 원본 파일이 아니라 심벌릭 링크 파일 이 삭제 된다!
#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"); // 심벌릭링크 삭제
}