디렉토리 엔트리
디렉토리 엔트리 쌍: 파일명과 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의 번호가 같다.
a의 symbolic link a-s를 만든다고 가정.
a-s의 새로운 디렉토리 엔트리가 생성되지만, 아까랑 inode 번호가 다르다.
inode 안에 원본 파일(a)에 대한 정보가 있다.
원본 파일과 symbolic link의 디렉토리 엔트리는 간접적으로 연결이 되어있다.
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
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에 관하여 (0) | 2023.11.02 |
[시스템프로그래밍] 프로그램, 프로세스, 스레드에 관하여 (2) | 2023.10.26 |
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 2 (1) | 2023.10.26 |
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 1 (0) | 2023.10.26 |