Minishell - shell 프로그램 만들기

bash를 모방해서 작은shell만들기 프로젝트

입력값 : [echo helloworld! > test.txt]
토크나이저 결과 
[ "echo", "helloworld!", ">", "test.txt"]
렉서 결과 
[
	{type: 'command', value:"echo" },
	{type: 'string', value: "helloworld!"},
	{type: 'redirect', value: ">"},
    {type: 'file', value: "test.txt"}
]

쉘에 명령을 입력하면 명령을 Lexical analyze하는데, 그 문자열을 Token으로 나누고 Lexer처리하는 것을 지칭한다.

커맨드를 입력받으면 먼저 본인이 만든 클론함수가 우선순위로 실행된다.

클론함수 (bash 모방함수)

클론 함수1: 현재 디렉토리를 변경하는 cd

클론 함수2: 인자로 보낸 텍스트를 출력하는 echo (-n 옵션 구현)

클론 함수3: 환경변수를 보여주는 env

클론 함수4: 현재 프로세스를 종료하는 exit

클론 함수5: 환경변수를 추가하는 export

클론 함수6: 환경변수를 지우는 unset

클론 함수7: 현재경로를 보여주는 pwd

리다이렉션 (<, <<, >, >>)

echo hello > a > b > c
result : a 빈파일, b 빈파일, c hello

다음 파이프전까지 마지막으로 선언 된 리다이렉션이 최종 대상이 된다.

실행 할 명령이 클론함수에 없다면 OS함수 실행하기

운영체제의 PATH에 있는 파일을 실행하기

절대경로를 쓰면 시스템콜stat함수를 이용해서 파일의 존재를 파악하는 방법으로 명령을 실행한다. 만약 그냥 "ls"처럼 파일명만 쓴다면 PATH에 있는 경로를 돌면서 "ls"파일을 찾아 실행한다.

실행 할 때 프로세스를 생성해서 실행한다. 정상적으로 종료되었는지 exit코드를 받아야 하기 떄문이다. 이 때 부모 프로세스는 waitpid함수를 이용해서 자식프로세스의 종료를 기다린다.

좋은 웹페이지 즐겨찾기