다운/퍼 가실 때 댓글 부탁드려요. 그리고 받으신 자료 유료 레포트 사이트에 올리지 말아주세요.
첨부파일 : 소스코드 + 설계문서
본문 내용 일부
2. 프로그램 설계(알고리즘)
가. 인자 처리
|
|
|
[그림 1] main함수의 매개변수 처리 구조 |
1) myls의 사용법은 [그림 1]과 같이 명령어 ‘myls'와 출력 옵션인 'options', 그리고 출력할 디렉토리 또는 파일 이름을 사용한다.
2) 프로그램의 시작은 main함수에서 시작하는데 main함수의 매개변수인 argc와 argv는 프로그램 수행 시 입력된 인자를 저장하는 변수이다. argc는 입력된 인자의 총 수를 나타내며 이중포인터로 구성된 argv는 각 인자를 저장하게 된다.
나. 옵션 체크
|
|
|
[그림 2] ls '-a' '-i' '-l'의 출력 형식 |
1) ls의 'a', 'i', 'l' 옵션은 다음과 같은 역할을 하는데, 'a' 옵션은 숨겨진 파일인 '.', '..'을 보여주며, 'i' 옵션은 파일의 inode 값을 출력하고, 'l' 옵션은 파일 접근권한, 링크수, 소유자, 소유그룹, 파일크기, 파일 수정일, 파일 이름을 보여준다.
2) 본 과제에서는 위의 여러 옵션들에 대해서 중복 입력이 가능하므로 중복입력 시에도 설정된 옵션만을 찾아내는 루틴이 필요하며 이러한 루틴은 아래 그림에 자세히 나와있다.
|
|
|
[그림 3] 옵션 플래그 설정 |
3) 위와 같이 여러 가지 옵션을 인자로 받았을 경우 옵션의 경우엔 '-'로 시작하므로 argv를 탐색하며 옵션으로 판별된 인자만을 선택한다.
4) 선택된 인자를 살펴서 'a'면 0x1, 'i'면 0x2, 'l'이면 0x4를 unsigned int형 변수인lsflag에 OR 연산한다. 즉, 'a'이면 lsflag의 0번째 비트에 'i'면 1번째 비트, 'l'이면 2번째 비트가 1로 설정되므로 후에 bit-wise AND 연산을 통하여 어떠한 옵션을 인자로 받았는지 쉽게 판별할 수 있다.
다. 디렉토리(파일) 체크
|
|
|
[그림 4] 디렉토리(파일) 저장 |
1) 옵션을 제외한 나머지 인자들은 디렉토리 또는 파일을 의미하므로 새로운 저장공간에 임시적으로 저장한다.
2) 저장된 디렉토리(파일)은 순서대로 옵션에 맞춘 출력을 하게 된다.
라. 디렉토리(파일) 속성 구하기
|
|
|
[그림 5] 파일 속성 구하기 |
1) 파일을 구성하는 내용으로는 파일이 디렉토리인지, 정규파일인지, 링크인지 여부를 나타내는 파일 종류, 파일을 읽고, 쓰고, 실행할 수 있는 파일권한, 파일과 연계된 링크의 개수, 파일의 소유자 및 그룹, 파일의 크기, 그리고 마지막으로 파일에 접근한 시간 등으로 나타낼 수 있다.
2) 이러한 속성을 구하기 위해서는 lstat(file_path, file_stat)를 사용하여 file_path 위치의 파일에 대한 file_stat 구조체를 얻어온다. 이렇게 얻은 file_stat 구조체의 멤버변수로는 st_mode, st_nlink, st_uid, st_gid, st_size, st_mtime 등이 있는데, 이를 이용하여 파일의 각 속성을 구할 수 있다.
3) 파일은 디렉토리, 정규파일, 링크, 블록디바이스, 캐릭터비다이스 등의 여러 종류로 구분되는데, filt_stat.st_mode와 S_IFMT를 AND 연산하면 매크로로 정의된 값이 반환된다. 예를 들어 'wiz'라는 디렉토리를 위와 같은 방식으로 연산하면 S_IFDIR이란 매크로값이 반환된다. 이 매크로는 해당 파일이 디렉토리라는 것을 의미한다.
|
|
|
[그림 6] 파일 권한 |
4) 파일은 또한 [그림 6]처럼 rwxrwxrwx 형식의 파일권한을 가지고 있는데, 이는 3개씩 끊어서 각각 user, group, others의 권한을 나타낸다. 이러한 파일의 권한을 체크하기 위해서는 file_stat.st_mode와 S_IREAD, S_IWRITE, S_IEXEC를 각각 AND 연산하여 true이면 권한이 설정되어 있다고 할 수 있다.
5) 그 외 파일링크수, 사용자명, 그룹명, 파일사이즈는 각각 file_stat 구조체의 st_nlink, st_uid, st_gid, st_size에 해당한다.
|
|
|
[그림 7] 각 시간 함수 관계 |
6) 파일의 시간은 [그림 7]과 같이 여러 가지 형태로로 표현될 수 있는데, 가장 기본적인 형태는 time_t이다. 본 과제에서는 이 기본적인 calendar time을 localtime() 함수를 이용하여 struct tm 형태로 변환하고, 형식화된 출력을 위하여 다시 strftime() 함수를 사용하였다. strftime()은 여러 출력형식을 통하여 시간을 표현할 수 있는 함수로 본 과제에서는 월을 표현하는 %b, 일을 표현하는 %e, 년도를 표현하는 %G, 시간:분 형태로 표현하는 %R을 사용하였다.
마. 디렉토리(파일) 속성에 따른 색 지정
|
|
|
[그림 8] 파일 속성에 따른 색상 표현 |
1) [그림 8]에서 보다시피 'ls' 명령을 통하여 출력된 파일 및 디렉토리는 그 종류에 따라서 고유의 색상이 표현된다. 일반적으로 디렉토리는 파란색, 링크파일은 연초색, 실행파일은 녹색, 블록 및 캐릭터 파일은 노란색으로 구분된다.
2) 콘솔 화면 상에 파일의 색을 지정하는 방법은 ^[[x;ym이라는 특수한 기호를 이용하는 방법이다. 예를 들어서 printf() 함수를 통하여 hi란 문자를 출력하는데 파란색으로 표현하고 싶다면 아래와 같이 한다.
|
printf("^[[0;34m Hi ^[[0m"); |
여기서 ^[는 Ctrl+V와 ESC를 연이어 누른 표시이고, ^[[0m은 색 지정을 해제한다는 구문이다.
3) 위의 방식을 이용하여 원하고자 하는 파일에 색상을 넣을 수 있으며, 기본적으로 사용되는 색상표는 아래 표와 같다.
|
제어 구문 |
색 상 |
제어 구문 |
색 상 |
|
^[[1;30m |
회색 |
^[[0;30m |
검은색 |
|
^[[1;31m |
선홍색 |
^[[0;31m |
빨간색 |
|
^[[1;32m |
밝은 녹색 |
^[[0;32m |
녹색 |
|
^[[1;33m |
밝은 노란색 |
^[[0;33m |
노란색 |
|
^[[1;34m |
밝은 파란색 |
^[[0;34m |
파란색 |
※ ^[[x;ym => x값이 높아질수록 보다 밝은 색상이 표현된다.
바. 링크 파일의 원본 파일 출력
|
|
|
[그림 9] 링크파일과 원본파일의 연결 형태 |
1) 링크 파일은 보통 심볼릭 링크를 얘기하는데, 이는 윈도우즈로 따지자면 바로가기에 해당하는 파일이다. [그림 9]와 같이 /home/wiz/setup이란 파일은 /usr/local/systerm/setup을 가리키고 있는 링크파일인데, 이와 같은 링크파일이 가리키는 원본파일을 알아내기 위해서는 readlink() 함수가 필요하다. readlink(link, original, size) 함수는 link 파일이 가리키는 원본 파일을 original에 저장한다.
'레포트 자료' 카테고리의 다른 글
| 시스템 프로그래밍 - find / grep 구현 (0) | 2009/05/28 |
|---|---|
| 시스템 프로그래밍 - ls 구현 (1) | 2009/05/28 |
| 컴퓨터 시스템 설계 및 실험 - Serial Memory 구현 (0) | 2009/02/02 |
| 시스템 프로그래밍 - shell 구현 (15) | 2009/02/02 |
| 마이크로프로세서 - skyeye를 이용한 uClinux 환경 구축 및 소수 출력 프로그램 (0) | 2009/02/02 |
| 컴퓨터구조 설계 및 실험 - 16bit CPU Architecture Design 최종 결과물 (3) | 2009/02/02 |


Assignment2 - myls.zip



