2. 과제의 목적 및 요구사항
- 간단한 Shell의 구현으로 실제 CLI환경의
프로그램수행 알고리즘과 pipe의 작동 메커니즘을 알 수 있도록 한다.
1. Batch mode / Interaction mode 의 구분
2. 명령의 구분
2-1 일반명령 구분자
2-2 “|” (pipe) 명령 구분자
3. 기타 shell 명령 수행 시 오류 처리
3. 과제의 목적 및 요구사항
ERR 종료 ERR 진행 예외처리
잘못된 개수의 argument 명령이 없음 명령줄이 빔
배치파일이 존재하지 않음 매우 긴 명령 명령줄에 불필요 공백
“ | | ” Quit없이 끝나는 Batch file
파이프가 양 끝 단에 존재 Ctrl + D 를 통한 종료
- 예외처리
4. 구성도
Main()
Mode select
Check(pipe_location)
Shell_process()
Get_token(‘|’)
Check(command.lengh )
Check(quit command)
Make command process
Make_tree()
Make fork() tree
Execute(command)
5. Data flowchart
Input user CMD
1 CMD String
“ | n”
“ ”
For(num of command){
fork();
}
execvp
(command_tok[0], command_tok);
Number of
commands
While(isquit)
Command tokens
6. CMD argument
• Get_token()함수를 이용, 반환 시 문자열 배열과 배열의 크기를
반환하여 명령 수에 따른 fork()를 수행 할 수 있도록 함.
13. 예외처리 list
ERR 종료
잘못된 개수의 argument
Batch file을 찾을 수 없음 Fopen 함수의 반환이 NULL일 경우
종료
ERR 진행
명령을 찾을 수 없음 Perror함수를 통해 ERR출력
중첩 파이프 ERR 출력 후, 1개 파이프 처리
양 끝 단에 파이프 존재 최초 CMD string 획득 시 char 배열의
양끝을 읽어 에러표기
예외처리
비어있는 명령줄 Token의 길이가 0일 경우 break
불필요 공백 Token 획득 시 무시
Quit없이 끝나는 Batch file
feof 함수 활용 EOF를 찾는다.
Ctrl + D
14. 구현 Check list
대화모드에서 명령어가 수행된 뒤, 프롬프트가 뜨는가 Y
배치모드에서 명령줄의 명령어들이 수행되지 전에 그 명령줄이 출력되는가 Y
한 명령줄에 여러 개 의 명령어들을 2개이상 넣었을때, 그 개수만큼만 에러메시지가 출력되는가? Y
‘;’과 같은 특수문자를 명령줄에 넣었을 때 인자로 인식되는가? Y
Quit가 여러 명령어들과 같이 한 명령줄에서 수행되었을 때, 다른 명령어들이 수행되지 않는 것
이 분명한가?
Y
첫 quit명령어를 수행 했을 때, 다음 명령 줄들은 모두 무시되는가? Y
16. 과제 수행 후 고찰
• fork를 통해 명령을 수행 함으로써 exec()함수로 인한 shell
process의 code부를 보호할 수 있었으며, 이는 계속해서 사용자
명령을 받아 처리할 수 있게 하였다.
• pipe()함수의 수행 시 kernel은 내부메모리에 IPC를 위한 자리를
할당하게 되며, 프로세서간 메시지가 할당된 메모리보다 클 경우
내부 메모리를 재 할당하여 늘리는 작업을 수행하게 된다. 이러
한 kerne작업을 막기 위해 편향된 fork() tree를 구성하여 여러
pipe를 생성하게 하여, 병렬로 프로세스를 수행하게 하였다.
17. 참고 자료
• http://wiki.falinux.com/ (C라이브러리 함수 참조)