ݺߣ

ݺߣShare a Scribd company logo
결과보고서 
“Shell_Project” 
20100434 류아침
과제의 목적 및 요구사항 
- 간단한 Shell의 구현으로 실제 CLI환경의 
프로그램수행 알고리즘과 pipe의 작동 메커니즘을 알 수 있도록 한다. 
1. Batch mode / Interaction mode 의 구분 
2. 명령의 구분 
2-1 일반명령 구분자 
2-2 “|” (pipe) 명령 구분자 
3. 기타 shell 명령 수행 시 오류 처리
과제의 목적 및 요구사항 
ERR 종료 ERR 진행 예외처리 
잘못된 개수의 argument 명령이 없음 명령줄이 빔 
배치파일이 존재하지 않음 매우 긴 명령 명령줄에 불필요 공백 
“ | | ” Quit없이 끝나는 Batch file 
파이프가 양 끝 단에 존재 Ctrl + D 를 통한 종료 
- 예외처리
구성도 
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)
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
CMD argument 
• Get_token()함수를 이용, 반환 시 문자열 배열과 배열의 크기를 
반환하여 명령 수에 따른 fork()를 수행 할 수 있도록 함.
Data flowchart(pipe) 
1 CMD String : char * 
“ | “ or “n” 
Command 1 : token_struct Command 2 : token_struct 
“ “ “ “ 
“|” 
Child1{ 
dup2(pipe[1], 1); 
close(pipe[1]); 
execv(); 
exit(); 
} 
Child2{ 
dup2(pipe[0], 0); 
close(pipe[0]); 
execv(); 
exit(); 
} 
out in
get_token()
| | | 
| 
| 
| 
Pipe()를 활용한 IPC 
• 자식-자식 간 통신을 지원하지 못하므로 편향 tree를 구성, 
명령을 수행한다.
Pipe()를 활용한 IPC 
• [shell_$] ls | cat | grep ch | more 
| 
| 
| 
more 
grep 
cat 
ls 
| 
| 
| 
wait 
• 말단의 node로 부터 명령을 수행하여 명령 행 순으로 수행하도록 한 
다.
Process tree flowchart 
No pipe? 
fork 
parent child 
P or C 
Dup2(in) 
Wait(child) 
Last CMD 
Excute 
CMD 
Dup2(out) 
Y 
N 
N 
Y
make_tree()
예외처리 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
구현 Check list 
대화모드에서 명령어가 수행된 뒤, 프롬프트가 뜨는가 Y 
배치모드에서 명령줄의 명령어들이 수행되지 전에 그 명령줄이 출력되는가 Y 
한 명령줄에 여러 개 의 명령어들을 2개이상 넣었을때, 그 개수만큼만 에러메시지가 출력되는가? Y 
‘;’과 같은 특수문자를 명령줄에 넣었을 때 인자로 인식되는가? Y 
Quit가 여러 명령어들과 같이 한 명령줄에서 수행되었을 때, 다른 명령어들이 수행되지 않는 것 
이 분명한가? 
Y 
첫 quit명령어를 수행 했을 때, 다음 명령 줄들은 모두 무시되는가? Y
최종 수행 결과
과제 수행 후 고찰 
• fork를 통해 명령을 수행 함으로써 exec()함수로 인한 shell 
process의 code부를 보호할 수 있었으며, 이는 계속해서 사용자 
명령을 받아 처리할 수 있게 하였다. 
• pipe()함수의 수행 시 kernel은 내부메모리에 IPC를 위한 자리를 
할당하게 되며, 프로세서간 메시지가 할당된 메모리보다 클 경우 
내부 메모리를 재 할당하여 늘리는 작업을 수행하게 된다. 이러 
한 kerne작업을 막기 위해 편향된 fork() tree를 구성하여 여러 
pipe를 생성하게 하여, 병렬로 프로세스를 수행하게 하였다.
참고 자료 
• http://wiki.falinux.com/ (C라이브러리 함수 참조)

More Related Content

20100434 류아침 주제2 결과보고

  • 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()를 수행 할 수 있도록 함.
  • 7. Data flowchart(pipe) 1 CMD String : char * “ | “ or “n” Command 1 : token_struct Command 2 : token_struct “ “ “ “ “|” Child1{ dup2(pipe[1], 1); close(pipe[1]); execv(); exit(); } Child2{ dup2(pipe[0], 0); close(pipe[0]); execv(); exit(); } out in
  • 9. | | | | | | Pipe()를 활용한 IPC • 자식-자식 간 통신을 지원하지 못하므로 편향 tree를 구성, 명령을 수행한다.
  • 10. Pipe()를 활용한 IPC • [shell_$] ls | cat | grep ch | more | | | more grep cat ls | | | wait • 말단의 node로 부터 명령을 수행하여 명령 행 순으로 수행하도록 한 다.
  • 11. Process tree flowchart No pipe? fork parent child P or C Dup2(in) Wait(child) Last CMD Excute CMD Dup2(out) Y N N Y
  • 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라이브러리 함수 참조)