weasel의 우당탕탕 개발기

운영체제 과제 1 (Simple User-level Unix Shell) 본문

운영체제

운영체제 과제 1 (Simple User-level Unix Shell)

becomeweasel 2022. 4. 9. 03:23

운영체제 과제 1 ( Simple User-level Unix Shell)

테스트 환경 :

  • OS : Ubuntu 16.04
  • gcc : gcc 5.4.0

개요 :

운영체제 첫번째 과제인 Simple User-level Unix shell에 대한 내용입니다.

크게 interactvie modebatch mode로 나뉘어지고
사용자가 입력한 명령 혹은 batch file을 읽어와서

명령을 수행하고 그 결과를 출력하는 프로그램입니다.

작동과정 설명 :

Interactvie Mode

첫번째로 interactvie mode내에서의 작동 과정과 예시입니다.
크게 사용자로부터 입력을 받아오고,

입력을 특정한 기준을 가지고 분할하여
execvp 함수를 사용하여 처리합니다.

  1. fgets() 함수를 통해 사용자에게 입력을 받습니다.
  2. strtok 함수를 사용하여 semi-colon과 space를 기준으로 raw한 입력을 유의미하게 분할합니다.
  3. 분할된 명령어들은 char* 이차원 배열에 저장됩니다.
  4. 명령의 개수만큼 fork 함수를 통해 자식프로세스를 생성합니다.
  5. 자식프로세스안에서 execvp 함수를 통해 저장된 명령어를 처리합니다.
  6. 부모 프로세스에서는 모든 자식프로세스가 끝나기를 기다린후, 모두 종료되면 다시 1번으로 돌아가도록 유도합니다.
    만약 이 과정에서 에러가 검출된다면 유저에게 알려줍니다.

작동예시 :

실행된 후 먼저 사용자가 명령을 입력할때까지 프로그램은 대기합니다.

그 후 사용자가 명령을 입력하면 (ex.ls -al)

> ls -al
image
위와 같이 명령을 처리합니다.

복수의 명령어( semi-colon으로 구분된)도 병렬적으로 처리가 가능합니다. (출력 순서는 섞일수 있습니다.)

> ls -al;pwd;ifconfig
image

quit command 입력시 쉘을 종료합니다.

> quit
image

에러 처리:

존재하지 않는 명령어를 입력시 유저에게 알려줍니다.

> thisisnotvalid
image

아무 입력을 하지 않고 엔터를 입력할 경우 다시 입력하도록 유도합니다.
image

아무 입력을 하지 않은 상태에서 ctrl-D를 입력할 경우 shell은 종료됩니다.
image

실행 전제 :

  1. 입력의 길이는 최대 1000자입니다.
  2. 입력받는 명령어는 최대 50개입니다.
  3. 명령어당 옵션의 개수(space로 구분하는 ex) -a -l -v -> 3개)는 최대 10개입니다.

작동과정 설명 :

Batch mode

두번째로 batch mode에 대한 설명과 예시입니다.
유저가 main 함수의 인자로 넘긴 batch_file을 읽어오고

명령어를 분할하고 처리하는 과정은 interactvie mode와 동일합니다.

  1. fgets() 함수를 통해 사용자가 실행될때 첨부한 batch_file을 한줄단위로 읽어옵니다.
  2. 마지막줄을 읽었다면 중지합니다.
  3. 만약 명령어가 없고 개행문자만 있는 빈 줄(\n)을 읽었다면 다음 라인을 읽기 위해 1번으로 돌아갑니다.
  4. strtok 함수를 사용하여 semi-colon과 space를 기준으로 raw한 입력을 유의미하게 분할합니다.
  5. 분할된 명령어들은 char* 이차원 배열에 저장됩니다.
  6. 명령의 개수만큼 fork 함수를 통해 자식프로세스를 생성합니다.
  7. 자식프로세스안에서 execvp 함수를 통해 저장된 명령어를 처리합니다.
  8. 부모 프로세스에서는 모든 자식프로세스가 끝나기를 기다린후, 모두 종료되면 다음 라인을 읽기 위해 1번으로 돌아갑니다.
    만약 이 과정에서 에러가 검출된다면 유저에게 알려줍니다.

작동예시:

./shell [batch_file] 형식으로 batch mode를 사용합니다.

vim test.txt
image

image

에러 처리:

존재하지 않는 명령어를 입력시 유저에게 알려줍니다.

> vim test.txt
image
image

사용자가 두개의 batch file을 인자로 넣을시 유저에게 경고를 보여주고 shell을 종료합니다.
image

실행 전제 :

  1. 입력의 길이는 최대 1000자입니다.
  2. 입력받는 명령어는 최대 50개입니다.
  3. 명령어당 옵션의 개수(space로 구분하는 ex) -a -l -v -> 3개)는 최대 10개입니다.

기타 에러 처리 사항:

  1. fork가 실패했을시 메모리에 심각한 문제가 있다고 판단하여 shell 을 종료합니다.
  2. batch file을 fopen을 사용했을대 NULL이 반환될시 비정상적 작동을 막기 위해 shell을 종료합니다.
  3. batch file을 두개 이상 사용시 (ex. ./shell batch_file batch_file 유저에게 경고를 보여준후 shell을 종료합니다.
  4. 명령어를 분할하는 단계에서 \n 개행문자를 삭제합니다. 개행문자가 삭제되지 않고 execvp의 인자로 입력될시 illegal option 에러를 표출하기 때문입니다.

코드

Operating-System-xv6