Fundamental of Software Develop/: : Linux System Programming

Linux System Programming : 링크 파일 생성

Jay.P Morgan 2023. 11. 10. 00:02

  링크 파일 생성

 

링크(Link)는 같은 파일이나 디렉터리에 여러 이름으로 접근할 수 있게 하는 새로운 이름을 말한다.

링크 기능을 이용하면 이전 시스템과의 호환성을 유지하거나, 경로가 복잡한 파일에 간단한 경로를 제공하는 등 편의성을 높일 수 있다.

 

구체적인 예시로, 루트 디렉터리 (/) 아래의 lib 디렉터리는 예전 시스템과의 호환을 위해 필요한데,

현재는 실제 디렉터리가 있는게 아니라 /usr/lib 디렉터리에 대한 심벌릭 링크로 유지하고 있다.

 

링크는 하드 링크와 심벌릭 링크 두 가지가 있으며, 둘 다 ln명령으로 생성한다.

프로그램에서도 함수를 사용해 하드 링크와 심벌릭 링크를 생성할 수 있다.

 

  1. 하드 링크 (Hard Link)

  - 하드 링크(Hard Link)는 파일에 접근할 수 있는 파일명을 새로 생성하는 것으로, 기존 파일과 동일한 inode를 사용한다.

  - 하드 링크를 생성하면 inode에 저장된 링크 개수(Link Count)가 증가한다.

 

  하드 링크 생성 : link(2)

#include <unistd.h>

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

  oldpath : 기존 파일의 경로,  newpath : 새로 생성할 링크의 경로

 

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

  link()함수는 수행에 성공하면 0을, 실패하면 -1을 반환한다.

 

  2. 심벌릭 링크 (Symbolic link)

  심벌릭 링크(Symbolic Link)는 기존 파일에 접근할 수 있는 다른 파일을 만든다. 

  기존 파일과 다른 inode를 사용하며, 기존 파일의 경로를 저장한다.

  심벌릭 링크의 정보를 검색할 때에는 lstat()함수를 사용하며, 내용은 readlink() 함수로 읽을 수 있다.

 

   (1) 심벌릭 링크 생성 : symlink(2)

#include <unistd.h>

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

  target : 기존 파일의 경로,  linkpath : 새로 생성할 심벌릭 링크의 경로

 

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

※ 심벌릭 링크인 linux.sym 파일이 생성되었다. 기존 파일에는 아무런 변화가 없음을 알 수 있다.

 

 

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

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

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

  pathname : 심벌릭 링크의 경로,  statbuf : 새로 생성할 링크의 경로

 

  stat()함수로 심벌릭 링크를 검색하면 원본 파일에 대한 정보가 검색된다. 심벌릭 링크 자체의 파일 정보는 lstat() 함수로 검색할 수 있다.

※ 1. stat ( "linux.txt" ) ,  2. stat ( "linux.sym" ),  3. lstat ( "linux.sym" )

 

 

  (3) 심벌릭 링크의 내용 읽기 : readlink(2)

#include <unistd.h>

ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);

  pathname : 심벌릭 링크의 경로,  buf : 읽어온 내용을 저장할 버퍼,  bufsiz : 버퍼의 크기

 

  Vim editor로 심벌릭 링크를 열면 원본 파일이 열린다. 심벌릭 링크 자체 데이터블록을 읽으려면 readlink() 함수를 사용한다.

 

※ ls -l 명령으로 확인했을 때, '->' 다음에 오는 원본 파일의 경로가 심벌릭 링크의 데이터 블록에 저장된 내용이다. (크기는 'linux.txt'의 바이트 수인 9 이다.

 

 

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

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

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

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

 

  realpath() 함수는 수행에 성공하면 실제 경로명이 저장된 곳을, 실패하면 NULL 포인터를 반환한다.

 

 

  3. 링크 끊기

  링크 끊기란 파일 시스템에서 링크를 삭제하는 것으로, unlink() 함수를 사용해 실행한다.

#include <unistd.h>

int unlink(const char *pathname);

    pathname : 삭제할 링크의 경로

 

  unlink() 함수는 호출에 성공하면 0을 반환한다.