좀 더 리눅스에서 파일 다뤄보기(링크) - whdlgp/system_programming_pra GitHub Wiki

링크

하드 링크와 심볼릭 링크 라는 녀석이 있다.

심볼릭 링크는 윈도우즈를 쓰면서 '바로가기'아이콘을 본 적이 있을 것이다. 그와 비슷하다.

  • 심볼릭 링크는 원본의 데이터 위치의 포인터를 가리킨다.
  • 원본이 망하면 같이 망한다.

하드 링크는 좀 괴리감이 느껴지는 개념인데, 원본데이터로 접근할 길을 한개 더 뚥어준다고 생각하면 된다. 원본 파일이 원본 데이터 inode 를 가리키고, 이 inode가 원본 데이터를 가리킨다. 하드 링크 파일은 똑같은 inode를 가리키게 된다.

  • 심볼릭 링크는 원본 파일과 같은 데이터를 가리키게 된다.
  • 원본 파일이 망해도 같이 안망한다.

이게 뭔 헛소린지 감을 잡기 위해 그림을 그렸다.

컴퓨터에 쪼오오금만 관심이 있어도, 우리가 '삭제'를 수행할 때 내용물을 전부 싹!다 날려버리는것은 아니라는 것을 알고 있을 것이다.
리눅스에서는 inode 라는 것으로 각 데이터들을 가리키고 있고, 만약 삭제를 하게 되면 데이터를 날리는게 아니라 inode의 번호를 날려버린다.

이해가 안된다면 위 그림에서 '원본 파일'을 없에보거나, 원본이 가리키는 inode로 가는 길을 짤라보자. 원본 파일 삭제시 하드 링크는 왜 데이터를 볼 수 있고, 심볼릭 링크는 볼 수 없는지 길을 따라가보면 알 수 있을 것이다.

심볼릭 링크 생성

symlink(원래 파일 이름, 링크로 걸 이름)

성공시0, 실패시 -1을 반환한다.

slink.c

#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을 반환한다.

hlink.c

#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을 반환한다.

unlink.c

#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를 지울 것이다.

⚠️ **GitHub.com Fallback** ⚠️