3/20 (ls명령어)
메타데이터를 가져오는게 목적.
ls -al : 다양한 정보들 나오는데 이거를 구현해보자.

인자별로 기능이 다르다.
인자를 모를경우?
- 구글링을 한다.
- man 메뉴얼을 본다.
- help 명령어를 친다. // ls —help
저번시간에 파일을 열었으니 이번시간에는 이것들을 진행
- 디렉토리를 열기
- 파일의 메타데이터 가져오기
디렉토리를 열면 엔트리가 있고 이거를 싹다 읽으면 끝나게 된다. 마지막에 디렉토리 닫는다.

- open dir
- read dir
- close dir
디렉토리 엔트리

inode : 디렉토리의 id번호가 부여되는데 그것.

일단은 이름만 출력되게 만들었다.(1번버전)
읽어온 다음에 readdir이 되면 계속 쓴다.
ls -al
- 리눅스에서 심볼릭링크, 하드링크라는 개념이 있는데 그것도 존재.
- 그룹
- 파일 사이즈
- 마지막으로 수행된 날짜
- 이름
stat
파일에 대하여 자세한 정보를 가져오기 “ stat “ 이라는 system call
stat은 위의 ls -al에 있는 정보들을 담는 구조체이다.

따라서 처음에 direct와 stat을 합치면 ls, ls -al 둘다 합칠 수 있다.
/etc/passwd
여기에 사용자의 번호를 알 수 있다. 나에게 부여된 그룹 등등 모든 정보 표시

stat 구조체에 st_mode는 뭘까??

100644
644가 마지막 3개의 비트이다.
6 : 읽고 쓰기 가능
4 : 읽기전용
파일에 대한 user는 1000번인데 그러면 6번권한 가능
지금은 root여서 group = user이지만, group이 만약에 4라고 하면 읽기 전용으로 된다.

| 값 | 의미 |
|---|---|
| 1 | 파일 유형 (일반 파일) |
| 00644 | Unix 파일 권한 (rw-r--r--) |
1. 첫 번째 숫자 (파일 유형)
| 첫 자리 | 유형 |
|---|---|
1 |
일반 파일 (regular file) |
2 |
심볼릭 링크 (symbolic link) |
4 |
디렉터리 (directory) |
따라서 마스킹을 해서 1이면 파일, 4가 되면 디렉토리라는걸 안다.
special bit
1. Special Bit 종류
| 비트 | 이름 | 8진수 값 | 설명 |
|---|---|---|---|
| SUID (Set User ID) | setuid |
4 |
실행 시 파일 소유자의 권한으로 실행됨 |
| SGID (Set Group ID) | setgid |
2 |
실행 시 파일 그룹의 권한으로 실행됨 / 디렉터리에 적용되면 새 파일이 해당 그룹을 상속 |
| Sticky Bit | sticky |
1 |
디렉터리에서 소유자만 삭제 가능 (/tmp 같은 공용 디렉터리에 사용됨) |
set uid(set user id bit)
패스워드는 아무나 함부로 바꾸면 안된다.
패스워드는 루트사용자 커널만 바꿀 수 있다.
비밀번호 데이터는 어떻게 접근할까??? → set uid비트를 통해 권한 승인한다.
ex)

민감한 파일을 접근할 때 권한을 일시적으로 높여준다.
sudo또한 권한을 일시적으로 올리는것.
special bit : s가 되면 권한 높음.
| 권한 | 의미 |
|---|---|
-rwsr-xr-x |
setuid 설정됨 (s는 실행 권한과 함께 표시) |
-rwxr-sr-x |
setgid 설정됨 (s는 실행 권한과 함께 표시) |
drwxrwxrwt |
sticky bit 설정됨 (t는 디렉터리에 적용) |
- s: 실행 권한(x)이 있을 때 사용 (s = x + 특수비트) |
|
- S: 실행 권한(x)이 없을 때 사용 (S = + 특수비트) |
|
- t: sticky bit가 설정된 경우 (t = x + sticky) |
/temp 디렉토리에는 어느 사용자든 사용자가 만들수 있다.
sticky비트를 세팅해놓으면 나만 이 파일을 삭제할 수 있다.
최종버전 ls2.c

ac : 인자를 하나 처리하고 하나씩 빼주면서 넘어가면서 처리해준다.
핵심함수 do_ls
- 디렉토리를 열고 dir_ptr라는 포인터로 모든걸 다한다.
- readdir에 인자로 dir_ptr을 준다.
- 디렉토리를 다 읽으면 direntp에 null이 들어간다.
- 엔트리 하나마다 dostat으로 들어간다.
- 각 엔트리에 대해서 do_stat을 부르고 있는데
- 인자로 들어온 파일이름, 파일을 받아올 포인터를 주면 info에 내용이 담긴다.
- info를 출력한다.
- ls -l의 왼쪽부분 포맷팅 하기 위해 mode_to_letters를 정의. 짝대기를 정의해놓고 치환방식.
과제
- 일단 main함수에서 do_ls로 상대경로를 주고 dostat함수를 부르는데, readdir함수는 경로를 없애고 파일 이름만을 리턴하기 때문에 dostat에 보내기 전에 경로를 만들어 주어야 한다.
- 화면에 표시되는것을 바꿔야 한다.
REF:
test_dir1_ls3:
drwxrwxr-x 2 4096 Mar 20 12:00 test_dir1_ls3/sub_dir1
-rw-r--r-- 1 0 Mar 20 12:00 test_dir1_ls3/file1_in_dir1.txt
-rw------- 1 0 Mar 20 12:00 test_dir1_ls3/file2_in_dir1.txt
OUT:
test_dir1_ls3:
drwxrwxr-x 2seungh 20 12:00test_dir1_ls3/sub_dir1
-rw-r--r-- 1seungh 20 12:00test_dir1_ls3/file1_in_dir1.txt
-rw------- 1seungh 20 12:00test_dir1_ls3/file2_in_dir1.txt
레퍼런스와 이렇게 다른게 표시된다.
drwxrwxr-x 2 4096 Mar 20 12:00 test_dir1_ls3/sub_dir1
항목별로 쪼개서 보면:
| 출력 부분 | 의미 설명 |
|---|---|
drwxrwxr-x |
파일 타입 + 퍼미션 (권한)d → 디렉토리rwxrwxr-x → 사용자(rwx), 그룹(rwx), 기타 사용자(r-x) 권한 |
2 |
하드 링크 수 (st_nlink)해당 파일(혹은 디렉토리)의 링크 수 (디렉토리는 보통 2 이상) |
4096 |
파일 크기 (st_size)파일의 바이트 크기디렉토리는 일반적으로 4096바이트 (4KB) |
Mar 20 12:00 |
마지막 수정 시간 (st_mtime)ctime() 함수로 포맷한 최근 수정된 시간 |
test_dir1_ls3/sub_dir1 |
파일 이름 (or 경로)현재 디렉토리 기준으로 상대 경로 표시 |
'SW > System Programming' 카테고리의 다른 글
| System Call (0) | 2025.03.30 |
|---|---|
| who command (0) | 2025.03.30 |
| Linux 커널 (0) | 2025.03.30 |