좀 더 리눅스에서 파일 다뤄보기(링크) - whdlgp/system_programming_pra GitHub Wiki
하드 링크와 심볼릭 링크 라는 녀석이 있다.
심볼릭 링크는 윈도우즈를 쓰면서 '바로가기'아이콘을 본 적이 있을 것이다. 그와 비슷하다.
- 심볼릭 링크는 원본의 데이터 위치의 포인터를 가리킨다.
- 원본이 망하면 같이 망한다.
하드 링크는 좀 괴리감이 느껴지는 개념인데, 원본데이터로 접근할 길을 한개 더 뚥어준다고 생각하면 된다. 원본 파일이 원본 데이터 inode 를 가리키고, 이 inode가 원본 데이터를 가리킨다. 하드 링크 파일은 똑같은 inode를 가리키게 된다.
- 심볼릭 링크는 원본 파일과 같은 데이터를 가리키게 된다.
- 원본 파일이 망해도 같이 안망한다.
이게 뭔 헛소린지 감을 잡기 위해 그림을 그렸다.
컴퓨터에 쪼오오금만 관심이 있어도, 우리가 '삭제'를 수행할 때 내용물을 전부 싹!다 날려버리는것은 아니라는 것을 알고 있을 것이다.
리눅스에서는 inode 라는 것으로 각 데이터들을 가리키고 있고, 만약 삭제를 하게 되면 데이터를 날리는게 아니라 inode의 번호를 날려버린다.
이해가 안된다면 위 그림에서 '원본 파일'을 없에보거나, 원본이 가리키는 inode로 가는 길을 짤라보자. 원본 파일 삭제시 하드 링크는 왜 데이터를 볼 수 있고, 심볼릭 링크는 볼 수 없는지 길을 따라가보면 알 수 있을 것이다.
symlink(원래 파일 이름, 링크로 걸 이름)
성공시0, 실패시 -1을 반환한다.
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
if(symlink(argv[1], argv[2]) == -1)
{ //원래파일 링크걸 이름
exit(1);
}
exit(0);
}
cli용 프로그램으로,
./slink data.txt slinkdata.txt
라 하면 data.txt의 심볼릭 링크인 slinkdata.txt 가 생길 것이다.
link(원래 파일 이름, 링크로 걸 이름)
성공시0, 실패시 -1을 반환한다.
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
if(link(argv[1], argv[2]) == -1)
{
exit(1);
}
exit(0);
}
마찬가지로 cli 프로그램이다.
./hlink data.txt hlinkdata.txt
라 하면 data.txt의 하드 링크인 hlinkdata.txt 가 생길 것이다.
unlink(지울 링크)
성공시0, 실패시 -1을 반환한다.
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
if(unlink(argv[1]) == -1)
{
perror(argv[1]);
exit(1);
}
exit(0);
return 0;
}
만약 hlink.txt라는 심볼릭/하드 링크를 만들었다면,
./unlink hlink.txt
는 hlink.txt를 지울 것이다.