minishell


요약: 이번 프로젝트의 목표는 간단한 쉘을 만드는 것입니다. 맞아요, 당신만의 작은 bash나 zsh이요. 프로세스나 파일 디스크립터에 대해 아주 많이 배우게 될 겁니다.

  • 이번과제에서는 간단한 쉘을 만드는 과제입니다..!

42서울중에서 난이도가 높다고 소문난 과제로.. 매일 사용하는 zsh쉘을 직접 구현하는 것이다.

지켜야 하는 것

  1. 프로젝트는 Norm 규칙에 맞춰 작성되어야 합니다. 보너스 파일/함수가 존재할 경우, 그 또한 norm 검사에 포함되며 norm error가 있을 시 0점을 받게 됩니다.
  2. 정의되지 않은 동작인 경우 외에는 여러분이 작성하신 프로그램이 예기치 않게 종료되면 안됩니다 (segmentation fault, bus error, double free 등). 만약 여러분의 프로그램이 예기치 않게 종료된다면, 작동하지 않은 것으로 간주되어 평가에서 0점을 받게 됩니다.
  3. 필요한 경우 heap에 할당된 모든 메모리 공간은 적절하게 해제되어야 합니다. 메모리 누수는 용납될 수 없습니다.
  4. 과제에서 필요한 경우, -Wall -Wextra -Werror 플래그를 지정하여 컴파일을 수행하는 Makefile을 제출해야 합니다. Makefile은 relink 되어서는 안 됩니다.
  5. Makefile은 최소한 $(NAME), all, clean, fclean, re 규칙을 포함해야 합니다.
  6. 프로젝트에 보너스를 제출하려면, Makefile에 보너스 규칙을 포함해야 합니다. 이 보너스 규칙은 프로젝트의 메인 파트에서 금지되었던 모든 다양한 헤더, 라이브러리, 또는 함수들을 추가하여야 합니다. 보너스 과제는 반드시 _bonus.{c/h}라는 별도의 파일에 있어야 합니다. 반드시 수행하여야 하는 메인 파트의 평가와 보너스 파트의 평가는 별도로 이뤄집니다.
  7. 만일 프로젝트에서 여러분의 libft 사용을 허용한다면, 소스들과 관련 Makefile을 함께 루트 폴더 안에 있는 libft 폴더에 복사해야 합니다. 프로젝트의 Makefile은 우선 libft의 Makefile을 사용하여 라이브러리를 컴파일한 다음, 프로젝트를 컴파일해야 합니다.
  8. 이 과제물을 제출할 필요가 없고, 채점 받을 필요가 없을지라도, 저희는 여러분들이 프로젝트를 위한 테스트 프로그램을 만들 것을 권장합니다. 이것은 여러분의 과제물과 동료들의 과제물을 쉽게 테스트할 수 있게 도울 것입니다. 또한, 평가를 진행할 때 이러한 테스트 프로그램들이 특히 유용하다는 사실을 알게 될 것입니다. 평가 시에는 여러분의 테스트 프로그램과 평가 받는 동료의 테스트 프로그램들을 당연히 자유롭게 사용할 수 있습니다.
  9. 할당된 git 저장소에 과제물을 제출하세요. 오직 git 저장소에 있는 과제물만 등급이 매겨질 것입니다. Deepthought가 평가하는 과제의 경우엔, 동료평가 이후에 Deepthought가 수행됩니다. 만약 Deepthought 평가 중에 오류가 발생한다면, 그 즉시 평가는 중지될 것입니다.

Mandatory part

사용 가능한 함수

readline, rl_on_new_line, rl_replace_line, rl_redisplay, add_history, printf, malloc, free, write, open, read, close, fork, wait, waitpid, wait3, wait4, signal, kill, exit, getcwd, chdir, stat, lstat, fstat, unlink, execve, dup, dup2, pipe, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs

쉘 기능

  1. 닫히지 않은 따옴표나 특정되지 않은 특수문자 (\나 ; 등…) 을 해석하지 않아야 합니다.
  2. 전역변수는 한 개 이상을 사용할 수 없으며, 왜 전역변수를 사용했는지 깊게 생각해 보고 그 이유를 설명할 수 있어야 합니다.
  3. 새로운 명령어를 입력할 수 있는 프롬프트를 보여줘야 합니다.
  4. 작업 히스토리를 갖고 있어야 합니다.
  5. (PATH 변수나 상대, 절대 경로를 활용하여) 올바른 실행 파일을 찾아 실행할 수 있어야 합니다.
  6. 다음의 내장 기능을 실행할 수 있어야 합니다:
    1. -n 옵션을 사용할 수 있는 echo
    2. 오직 상대 또는 절대경로만 사용하는 cd
    3. 옵션이 없는 pwd
    4. 옵션이 없는 export
    5. 옵션이나 인자값이 없는 env
    6. 옵션이 없는 exit
  7. '는 일련의 문자열에 대한 해석을 금지합니다.
  8. "$를 제외한 모든 문자열에 대한 해석을 금지합니다.
  9. 리다이렉션
    1. <는 입력을 리다이렉션 하여야 합니다
    2. >는 출력을 리다이렉션 하여야 합니다
    3. <<는 현재 소스에서 구분자를 포함한 줄을 만나기 전까지 입력값을 읽어들입니다. 기록을 업데이트할 필요는 없습니다.
    4. >>는 출력을 추가 모드로 리다이렉션합니다.
  10. 파이프 : 각 파이프라인마다 명령어의 출력값은 파이프로 연결되어 다음 명령어의 입력값으로 들어가야 합니다.
  11. 환경 변수 ($ 다음에 문자열이 오는 형식) 은 그들의 값으로 확장되어야 합니다.
  12. $?는 가장 최근에 실행한 포그라운드 파이프라인의 종료 상태를 확장하여야 합니다
  13. ctrl-C, ctrl-D, ctrl-\ 는 bash와 동일하게 동작하여야 합니다.
  14. 상호작용이 가능할 때:
    1. ctrl-C는 새로운 줄에 새로운 프롬프트를 출력합니다
    2. ctrl-D는 쉘을 종료합니다.
    3. ctrl-\은 아무런 동작도 하지 않습니다.
  15. 요구하지 않은 것들을 만드실 필요는 없습니다.

필요한 지식!

readline 라이브러리 사용

프롬포트를 출력하기 위해 해당

태그: ,

카테고리:

업데이트:

댓글남기기