Projects‎ > ‎

Mini Shell

Problem

  1. 자기 자신의 prompt를 출력한다. *('$' 나 '#' 는 prompt로 사용하지 말 것 )*
  2. 유저가 지정한 directotry(예: $HOME/bin)에 있는 command를 입력할 때마다 그 command를 실행한다. 
  3. 백그라운드실행(&), 리다이렉션(<,>,2>), 파이프라이닝(|) 기능을 구ㅎ한다.
  4. 만약에 유저가 goodbye라고 입력하면 이 프로그램의 실행을 마친다. 
  5. Example
my-prompt> ls a.out my-shell.c my-shell my-prompt> echo Hello! Hello! my-prompt> echo Hello! > hello.txt my-prompt> ls a.out hello.txt my-shell.c my-shell my-prompt> cat hello.txt Hello! my-prompt> my-prompt> my-prompt> goodbye Bye bye!

Note

- UNIX system call에 대해서 알아야 한다. ~*(fork , exec, wait )*~
- 프로그램에는 반드시 적절한 comment를 달 것. 
- 프로그램의 분량은 대략 100-120줄 정도면 충분할 것이다. 
- 다음과 같은 define들이 필요할 수 도 있다.

#define MAX_LINE 256 /* maximum number of letters in a single line */

#define END_CMD "goodbye"

#define PROMPT "my-prompt>" 
/* use your own prompt */

#define IS_WHITE_SPACE(x) ((x)==' ' || (x)=='\t')

#define IS_EOS(x) ((x)=='\0')

#define PREFIX "~/bin"

Hint

Mini Shell을 작성할 때 다음 프로그램을 참고하도록 한다.

또는 교재 5장 smallsh 참조

#include <stdio.h>

#define MAX_ARG         8
#define MAX_LENGTH      32

int main()
{
   int p;
   int s;
   int i, arg_num;
   char parse[MAX_ARG][MAX_LENGTH];
   char *arg[MAX_ARG];
   
    strcpy(parse[0],"/bin/ls");
    strcpy(parse[1],"-l");
    strcpy(parse[2],"-a");
    arg_num = 3;
    
   if (p = fork()) {
       /* Parent */
        waitpid(p,&s,0);
        printf("Program is normally completed.\n");
    }
   else {
       /* Child */
       for(i=0; i<arg_num; i++) arg[i] = parse[i];
        arg[i]=(char *)0;
        execl(arg[0],arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],arg[7]);
    }

제출 방법

리포트 내용

  1. 자신의 접근 방법, 구현 방법 등을 기술, UNIX System Call (fork, exec, wait)의 Study 결과 
  2. TESTCASE 
  3. 부록: 소스 코드
Comments