일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ft_printf
- 지베르니 계절 추천
- 지베르니 가을
- printf
- 이지젯
- str함수
- pipex
- 굿노트 스티커
- 42 libft
- gnl
- 42 pipex
- 서울42
- 에꼴42
- libft
- push swap 설명
- pipex 42
- get next line
- 포르투갈 여행
- 42
- 지베르니
- 파리 피크닉
- 지베르니 여름
- so_long
- 알고리즘 기초
- 와인 고르기
- 와인선별방법
- 42 so_long
- push swap
- get_next_line
- ecole42
- Today
- Total
뇌 마음 반반저장소
[42_pipex] 탐구4. inode, 파일권한(chmod), 링크파일(하드, 심볼릭) 쉽게 알아보기 본문
파일 간의 링크란?
1. inode
inode는 파일이나 디렉터리의 고유번호와 정보를 담고 있다. Index의 색인이란 단어와 node의 데이터의 지점이라는 단어가 붙어서 inode는 데이터 색인? 정도로 해석할 수 있겠다.
터미널에 명령어로 ls -l이라고 쳐보자.
$ ls -l
total 0
drwxrwxrwx 1 myID myID 512 Jan 6 16:24 A
drwxrwxrwx 1 myID myID 512 Jan 6 16:24 B
drwxrwxrwx 1 myID myID 512 Jan 6 16:24 C
-rwxrwxrwx 1 myID myID 0 Jan 6 16:24 a.c
-rwxrwxrwx 1 myID myID 0 Jan 6 16:24 b.h
-rwxrwxrwx 1 myID myID 0 Jan 6 16:24 c.txt
ls -l 명령어는 아래와 같은 inode의 정보를 나타낸다.
디렉터리(폴더) 'd' 말고도 앞자리가 다른 특수파일들이 있다. /dev 폴더에 들어가 보자.
b : 블록 장치 특수 파일, 대부분 저장소이다.
brw------- 1 root root 1, 0 Jan 6 16:23 ram0
brw------- 1 root root 8, 0 Jan 6 16:23 sda
c : 문자 장치 특수 파일, 터미널 같이 입출력을 할 수 있다.
crw-rw-rw- 1 root root 5, 0 Jan 6 16:23 tty
p : 파이프 특수 파일, FIFO Special Files이라고 부른다. 파이프 역할을 해준다.
$ mknod pipe_file p #파이프 파일 만드는 방법
$ ls -l | grep pipe_file
prw-r--r-- 1 root root 0 Jan 6 17:28 pipe_file
s : 소켓 특수 파일, 소켓은 전기 콘센트 소켓(돼지코)처럼 다른 세상과의 네크워킹을 제공한다. 서버 간의 파이프라고 생각할 수 있다. (소켓 파일을 만드는 게 너무 어려웠다 😓)
l : 심볼릭 링크 파일, 아래에서 더 자세히 알아보자!
위에서 inode는 각각 번호가 있다고 했다. 터미널에 명령어로 ls -i를 입력해 보자.
$ ls -i
8725724278095939 A 37154696925881602 C 29836347531409986 b.h
9851624184938813 B 17169973579429858 a.c 17732923532852109 c.txt
이렇게 파일의 고유번호가 나온다. 사실 이 번호는 리눅스가 이해하는 파일의 이름이다! (워매 긴 거) 이것이 바로 inode 넘버이다!
찾아보다가 굉장히 재미있는 사실을 알아냈는데, 이 파일의 정보들은 함수로 들어가서 검색이 된다. inode 정보는 stat라는 구조체에 저장이 된다. 아래는 stat구조체이다.
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict statbuf);
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number 아이노드 번호 */
mode_t st_mode; /* File type and mode 파일 유형 및 모드 */
nlink_t st_nlink; /* Number of hard links 하드 링크의 수 */
uid_t st_uid; /* User ID of owner 소유자 소유자 ID */
gid_t st_gid; /* Group ID of owner 소유자 그룹 ID */
dev_t st_rdev; /* Device ID (if special file) 장치 ID */
off_t st_size; /* Total size, in bytes 바이트 단위의 총 크기 */
blksize_t st_blksize; /* Block size for filesystem I/O 파일 시스템을 위한 블록크기 */
blkcnt_t st_blocks; /* Number of 512B blocks allocated 할당된 512b 블록의 수 */
struct timespec st_atim; /* Time of last access 마지막 액세스 시간 */
struct timespec st_mtim; /* Time of last modification 마시막 수정시간 */
struct timespec st_ctim; /* Time of last status change 마지막 상태변경 시간 */
#define st_atime st_atim.tv_sec /* Backward compatibility 하위 호환성 */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
알면 알수록 컴퓨터의 세계는 정확하고.. 계산되어 있고.. 정말 환상적이다 ✨
2. 링크파일
기본적으로 링크 파일은 말 그대로 연결된 파일이라는 뜻이다.
1. 하드링크
실습을 하면서 이해를 해보자.
일단 c.txt의 파일을 만들고 안에 내용을 넣어준다.
$ cat c.txt
easy peasy link file
그리고 파일을 연결해 보자. ln(link) 명령어로 c.txt와 새로운 파일을 생성하면서 d.txt를 연결해 준다.
$ ln c.txt d.txt #ln 명령어로 두 파일을 연결해 주는데 d.txt파일을 생성하며 연결한다.
$ ls
A B C a.c b.h c.txt d.txt
$ cat d.txt #파일이 링크되면서 내용도 같이 들어갔다.
easy peasy link file
$ ls -il
total 0
32088147345025272 -rwxrwxrwx 2 myyou myyou 21 Jan 6 17:56 c.txt
32088147345025272 -rwxrwxrwx 2 myyou myyou 21 Jan 6 17:56 d.txt
마지막에 ls -il로 둘의 inode 내용을 보면 inode 아이디도 같고 2개로 링크되어 있는 것을 볼 수가 있다.
c.txt 의 내용을 한번 바꿔보자.
$ echo this is hard link > c.
txt
$ cat c.txt
this is hard link
$ cat d.txt
this is hard link
c.txt의 내용을 바꾸니 함께 링크되어있는 d.txt도 내용이 바뀐다!
이게 복사랑 뭐가 다른가 싶겠지만 하드링크를 사용하면 같이 연결된 파일이 실시간으로 링크가 끊길 때까지 바뀐다.
2. 소프트, 심볼릭 링크
이 두 개의 이름은 같은 의미이다. 소프트 링크, 심볼릭링크 같은 뜻이다! 그럼 예제로 살펴보자.
$ ln -s d.txt syb_link
ln 명령어에 -s를 붙이고 원하는 이름을 마지막에 붙여주면! 심볼릭 링크가 만들어진다.
$ ls -il
total 0
32088147345025272 -rwxrwxrwx 2 myyou myyou 18 Jan 6 18:10 c.txt
32088147345025272 -rwxrwxrwx 2 myyou myyou 18 Jan 6 18:10 d.txt
12666373952030307 lrwxrwxrwx 1 myyou myyou 5 Jan 6 18:21 syb_link -> d.txt
심볼릭 링크는 inode가 다르다! 그리고 뒤에 -> 이런 이상한 표시가 생겼다.
이 표시는 말 그대로 syb_link를 실행하면 d.txt로 가라는 포인터 같은 녀석이다! 다른 블로거님이 든 예를 참고하면 바로 "바탕화면에 있는 바로가기 같은 아이콘"인 것이다.
그렇다면 syb_link를 실행하면 무엇이 나올까?
$ echo symbolic link is created > d.txt #d.txt의 내용을 바꿔 보았다. 하드 링크로 c.txt와 연결되어 있기 때문에 둘 다 바뀔 것이다.
$ cat syb_link
symbolic link is created
바로 c.txt의 내용이 나온다!
연결된 링크를 삭제할 때는 rm 명령어를 사용해서 파일 전체를 삭제해줘야 한다!
이 링크 개념은 허용함수인 unlink함수를 위해서 알아보았다!
읽어보면 좋은 자료
명령어 함수들의 원형을 설명해 놓음 https://jihooyim1.gitbooks.io/unixbasic/content/contents/03.html
참고자료 :
https://web.eecs.utk.edu/~huangj/cs360/360/notes/Links/lecture.html
'42 > pipex' 카테고리의 다른 글
[42_pipex] 함수2. dup, dup2, execve, access, unlink 자세한 설명 (0) | 2023.01.07 |
---|---|
[42_pipex] 함수1. pipe, fork, wait, waitpid 자세한 설명 (0) | 2023.01.07 |
[42_pipex] 탐구3. 부모·자식 프로세스 개념 쉽게 알아보기 (0) | 2023.01.07 |
[42_pipex] 탐구2. 프로세스의 과정 쉽게 알아보기 (0) | 2023.01.06 |
[42_pipex] 탐구1. pipex 구조 자세히 살펴보기 및 예제 (0) | 2023.01.05 |