[시스템프로그래밍] 디렉토리 엔트리, hard/symbolic link, stat에 관하여

2023. 11. 2. 15:17·Study/시스템프로그래밍

 

디렉토리 엔트리

 

디렉토리 엔트리 쌍: 파일명과 inode 번호

 

파일 정보는 inode에 있다 -> 포인터 정보들

(inode 안에 실제로 파일 내용들이 있는 것이 아니라, 이 포인터를 쫓아가야 파일 내용들이 있다. → 실제 파일들의 크기는 다른데 inode들의 크기는 같다.)

 


디렉토리 관련 명령어

 

chdir로 작업 디렉토리를 변경할 수 있다.

 

현재 작업디렉토리의 정보를 알아오는 시스템콜 → getcwd

 

디렉토리도 파일이다.(특별한 타입의)

모든 디렉토리 안에는 디렉토리 엔트리들이 있다.

 

디렉토리도 접근하려면 open을 해야한다.

디렉토리 오픈 → opendir 시스템 콜 사용

 

DIR *opendir (const char *dirname);

dirname → 우리가 열고 싶은 디렉토리의 이름

DIR : directory stream을 나타낸다.(디렉토리 엔트리들)

 

디렉토리 엔트리를 읽으려면 → readdir 사용

 

struct dirent *readdir(DIR *dirptr);

(디렉토리 엔트리는 여러 정보가 있으므로 구조체이다.)

성공하면 first struct dirent pointer를, 실패하면 null pointer를 return한다.

 

디렉토리 닫기 → closedir

디렉토리 스트림들 안의 포인터를 다시 처음으로 돌리고 싶다면? → rewinddir 사용

 

ls 명령어를 구현하고 싶다면 위 명령어들을 사용하면 된다.

 


hard link와 symbolic link

 

디렉토리 엔트리와 inode가 어떻게 연결되있느냐에 따라 hard link와 symbolic link가 구분된다.

 

hard link: 직접적으로 연결

symbolic link : 간접적으로 연결 → 바로가기 아이콘

 

보통 우리가 다루는 파일들은 hard link이다.

 

파일을 만들면 디렉토리 엔트리가 생긴다.

 

파일 a를 만든다. → a에 대한 inode 생성

inode의 고유한 번호가 생성 된다.

디렉토리 엔트리가 inode를 직접적으로 가리킨다. → a는 hard link

 

hard link a를 또 만들려면?

→ ln 사용, 디렉토리 엔트리가 또 생성된다. 아까와 inode의 번호가 같다.

 

Two Hard links to same file

 

a의 symbolic link a-s를 만든다고 가정.

 

a-s의 새로운 디렉토리 엔트리가 생성되지만, 아까랑 inode 번호가 다르다.

inode 안에 원본 파일(a)에 대한 정보가 있다.

원본 파일과 symbolic link의 디렉토리 엔트리는 간접적으로 연결이 되어있다.

 

symbolic links to same file

 


lstat과 stat

 

파일을 생성하면 디렉토리 엔트리와 inode가 생기는데, inode 안에 파일의 속성들이 들어있다.

 

inode 안의 속성(meta-information)들을 알고 싶다면?

→ lstat과 stat 사용

 

int lstat(const char **restrict path, struct stat restrict buf);

→ lstat은 link에 대한 정보들을 return

→ symbolic link의 경우 링크에 직접 연결되 있는 파일에 대한 정보를 return

 

int stat(const char **restrict path, struct stat restrict buf);

→ stat은 file referred to by the link를 return

→ symbolic link의 경우 원본 파일에 대한 정보 return

 


struct stat structure

 

sys/stat.h에 정의됨

 

dev_t st_dev

→ 파일을 담는 기기의 Device ID

 

ino_t st_ino

→ file의 serial number

 

mode_t st_mode

→ 파일 모드

 

nlink_t st_nlink

→ 하드링크들의 개수

 

uid_t st_uid

→ 파일의 User ID

 

gid_t st_gid

→ 파일의 group ID

 

off_t st_ size

→ 파일 크기

 

time_t st_atime

→ 최근 access 시간

 

time_t st_mtime

→ 최근 data modification 시간

 

time_t st_ctime

→ 최근 file status change 시간

 

st_atime을 그냥 출력하면 엄청 긴 숫자가 나온다. → ctime 사용


inode pointer

inode 구조

direct pointer: 이 포인터를 쫓아가면 파일의 내용을 담고 있는 블럭으로 간다.

indirect pointer: 이 포인터를 쫓아가면 direct pointer를 담고 있는 블럭으로 간다.

 

single indirect pointer → 한 번 이동해야 블럭이 나온다.

double indirect pointer → 두 번 이동해야 블럭이 나온다.

triple indirect pointer → 세 번 이동해야 블럭이 나온다.

 

directory = inode number + file name

 

inode + file name의 장점

  • 큰 파일을 move를 한다는 것은 파일의 디렉토리를 바꾸는 것인데, 디렉토리 엔트리의 위치만 바꾸면 된다.

 

 

저작자표시 비영리 변경금지 (새창열림)

'Study > 시스템프로그래밍' 카테고리의 다른 글

[시스템프로그래밍] Signals  (1) 2023.12.03
[시스템프로그래밍] pipe에 관하여  (1) 2023.11.02
[시스템프로그래밍] 프로그램, 프로세스, 스레드에 관하여  (2) 2023.10.26
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 2  (1) 2023.10.26
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 1  (0) 2023.10.26
'Study/시스템프로그래밍' 카테고리의 다른 글
  • [시스템프로그래밍] Signals
  • [시스템프로그래밍] pipe에 관하여
  • [시스템프로그래밍] 프로그램, 프로세스, 스레드에 관하여
  • [시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 2
퀵차분
퀵차분
Web Developer 🥐
QC's DevlogWeb Developer 🥐
  • 퀵차분
    QC's Devlog
    퀵차분
  • 전체
    오늘
    어제
    • 분류 전체보기 (175)
      • Frontend (30)
      • Fedify (4)
      • Study (42)
        • NestJS (2)
        • Node.js (3)
        • Modern JS Deep Dive (13)
        • SQL (1)
        • Network (1)
        • 프롬프트 엔지니어링 (4)
        • 인공지능 (9)
        • 시스템프로그래밍 (11)
        • 선형대수학 (1)
      • Intern (4)
      • KUIT (21)
      • Algorithm (48)
        • Baekjoon(C++) (26)
        • Programmers(JavaScript) (22)
      • 우아한테크코스(프리코스) (4)
      • Project (8)
        • crohasang_page (1)
        • PROlog (4)
        • Nomadcoder (2)
      • 생각 (4)
      • Event (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    fedify
    인공지능
    HTML
    오블완
    리액트
    typescript
    음악추천
    백준
    자바스크립트
    react
    프로그래머스 자바스크립트
    알고리즘
    타입스크립트
    javascript
    프론트엔드
    KUIT
    프로그래머스
    티스토리챌린지
    next.js
    시스템프로그래밍
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
퀵차분
[시스템프로그래밍] 디렉토리 엔트리, hard/symbolic link, stat에 관하여

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.