SW/System Programming

ls 명령어

seungH 2025. 3. 30. 21:41

3/20 (ls명령어)

메타데이터를 가져오는게 목적.

ls -al : 다양한 정보들 나오는데 이거를 구현해보자.

인자별로 기능이 다르다.

인자를 모를경우?

  1. 구글링을 한다.
  2. man 메뉴얼을 본다.
  3. help 명령어를 친다. // ls —help

저번시간에 파일을 열었으니 이번시간에는 이것들을 진행

  1. 디렉토리를 열기
  2. 파일의 메타데이터 가져오기

디렉토리를 열면 엔트리가 있고 이거를 싹다 읽으면 끝나게 된다. 마지막에 디렉토리 닫는다.

  1. open dir
  2. read dir
  3. close dir

디렉토리 엔트리

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

일단은 이름만 출력되게 만들었다.(1번버전)

읽어온 다음에 readdir이 되면 계속 쓴다.

ls -al

  1. 리눅스에서 심볼릭링크, 하드링크라는 개념이 있는데 그것도 존재.
  2. 그룹
  3. 파일 사이즈
  4. 마지막으로 수행된 날짜
  5. 이름

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

  1. 디렉토리를 열고 dir_ptr라는 포인터로 모든걸 다한다.
  2. readdir에 인자로 dir_ptr을 준다.
  3. 디렉토리를 다 읽으면 direntp에 null이 들어간다.
  4. 엔트리 하나마다 dostat으로 들어간다.
  5. 각 엔트리에 대해서 do_stat을 부르고 있는데
  6. 인자로 들어온 파일이름, 파일을 받아올 포인터를 주면 info에 내용이 담긴다.
  7. info를 출력한다.
  8. ls -l의 왼쪽부분 포맷팅 하기 위해 mode_to_letters를 정의. 짝대기를 정의해놓고 치환방식.

과제

  1. 일단 main함수에서 do_ls로 상대경로를 주고 dostat함수를 부르는데, readdir함수는 경로를 없애고 파일 이름만을 리턴하기 때문에 dostat에 보내기 전에 경로를 만들어 주어야 한다.
  2. 화면에 표시되는것을 바꿔야 한다.
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