ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [minishell] Shell이란? 그리고 Shell이 하는 일
    42seoul 2021. 3. 1. 13:15

    Shell이란?

    조개껍데기!

    Shell은 운영체제 커널(핵심, 알맹이)과 사용자를 이어주는 역할로, 커널을 감싸고 있는 껍데기 같다고 하여 Shell이라고 부른다.

    처음보는 사람에게는 어렵게 생겼지만 User 레벨 프로그램이다.
    명령어를 입력하면, 수행해주는 명령어 실행기 (Command line interperter)이다.
    Bourne Shell, C Shell, ksh, tcsh, bash... 여러가지 종류가 있다.

    Shell이 하는 일 : Command 처리

    입력 받아들이기
    echo a; echo b; echo c;
    token으로 분리하기
    token1 :echo a
    token2: echo b
    token3: echo c
    분리된 token을 Command, file name, argument 등으로 구분한다.
                    command            argument
    token1 :
                        echo                    a
    token2: 
                        echo                    b
    token3: 
                        echo                    c
    redirection 수행 후, argument로 부터 I/O redirection 연산자를 제거한다.
    Command 수행한다. (Child Process)
    부모 프로세스는 자식 프로세스의 종료를 기다린다.

    Shell built in과 built in 커맨드

    minishell 과제에서는 말그대로 작은 나만의 쉘을 만들게 되는데
    built in 기능과 쉘이 자체적으로 가지고 있는 기능이 나뉘어져있다.

    • 외부명령어 : built in

    • 찾아서 실행을 시켜야 한다.

    • 내부명령어 : shell built in
      직접 만들어야한다.

    • It must implement the builtins like in bash:
      ◦echo
      ◦cd
      ◦pwd
      ◦export
      ◦unset
      ◦env
      ◦exit

    • 내부명령어는 man {command}, help {command}로 설명을 볼 수 있다. (help는 bash에서 작동)

    • 외부명령어는 man {command}로 설명을 볼 수 있다.

     

    built in 커맨드를 입력하면 컴퓨터의 어딘가에 있는 프로그램을(ls, chmod 등...) 실행시켜줘야하고
    그 외의 커맨드는 직접 구현을 해야한다.(cd, export, pwd 등...)

    built in 커맨드의 경우 날로먹는(?)다는 느낌이 있을 수 있지만
    프로그램을 돌리기 위해서는 찾아야하고, 또 프로그램을 child process에서 돌려줘야하기 때문에 fork()등의 함수를
    사용해야 한다.
    사용법을 모른다면 이것을 익히는 공부를 하게 되기 때문에
    생각보다 휘리릭 뚝딱은 아니다.

    "echo $PATH"

    위 명령어를 쉘에 입력하면 아래와 같은 경로들을 보게 된다. 각 경로는 콜론 기준으로 나뉘어 있다.

    경로1:경로2:경로3:(생략...)경로29:경로30:

    이 경로들을 parsing하여 (token을 세미콜론 기준으로 나누는 함수를 재활용 할 수 있다.)
    하나씩 들어가서 사용자가 입력한 명령어에 해당하는 프로그램에 있는지 살펴본다.
    있으면 fork하여 프로그램을 돌린다.

    전체적인 과정은 이렇게 간단하다.

    입력 parsing -> 명령어 구분 -> 빌트인 명령어/ 쉘 빌트인 명령어 처리 -> 출력

    이 과정을 사용자가 프로그램을 종료하는 행동을 하기 전까지는 계속 루프를 돌려주면 된다.

    그러나 미니쉘이 어떤 과제와 가장 비슷하냐면 printf와 비슷하다.
    parsing이 큰 비중을 차지하고, 오래걸린다.

    built in 함수를 찾고, 쉘 내장 함수를 구현하는 것까지 가기가 생각보다 쉽지 않은데, 함수 구현도 자세하게 하자면
    끝이 없을 것 같다. 예외 케이스가 계속생겨서 코드가 점점 조각보처럼.. 누덕누덕해진다..
    예외 처리 끝판왕 과제 인 것 같다.

    어느 정도까지 구현을 할 것 인지
    선택과 집중을 해야하는 과제이다.

    '42seoul' 카테고리의 다른 글

    [libasm] 어셈블리 (about 1 week)  (0) 2021.03.26
    [cub3d] map parse 맵 파싱하기  (0) 2021.03.21
    [cub3d] 과제 시작하기  (0) 2021.02.19
    [42서울] 2월 16일(화) 레포트  (0) 2021.02.16
    [cub3D] Makefile  (0) 2021.01.05

    댓글

Designed by Tistory + Edited by Juepark