팀원과 함께 minishell을 만들며 있었던 여러 문제들을 기록하며 minishell을 정리하고 minishell과 minishell을 만들기 위해 알아야 하는 개념들을 정리 해보려 한다.
bash와 비슷하게 동작하는 minishell을 만들기 위해서는 먼저 bash에 동작에 대해 알아야하고 그에 따라 bash manual과 추가적으로 gnu bash git을 clone하여 실제 code를 참고하여 동작의 순서와 방식을 파악하려는 시도를 하였다.
minishell 전체의 flow chart는 다음과 같다.
팀원이 execute와 동작들에서 발생할 수 있는 exception에 대한 part를 맡았고,
본인이 initial & input, parsing에 대한 part를 주로 맡아 진행하였다.
initialize part에서는 크게 3가지 동작을 수행해야 한다.
bash에서 signal은 여러 코드의 진행 상황에 따라 다른 반응을 확인할 수 있다. 크게 4가지로 나누어 signal의 반응을 고려하였다.
execute 함수를 사용한 경우 미리 설정한 signal과 다르게 동작하기 때문에 execute 함수 작동 중 signal이 발생한 경우는 다른 방법을 사용하여 signal을 handling 해주었다.
shell 전반적으로 필요한 자료구조는 처음에 초기화하여 minishell 동작 중에 계속해서 사용하다가 main 함수 return 또는 exit 전에 destroy 해주었다.
parsing은 크게 3 단계로 나누어 진행하였다.
execute는 pipeline과 redirect에 따라 stdin, stdout, fd 값들을 조정하여 command의 결과를 fd에 적절하게 넘기는 과정과 builtin command들의 예외와 argument 형태에 따라 다른 동작에 신경을 썼다.
expand의 과정은 실제 bash opensource를 참고하여 command 실행하기 직전에 해주는 순서로 배치하였다.
처음 minishell을 시작할때 bash의 집중적인 분석과 opensource의 분석 없이 minishell을 시작하여 한달 동안 bash의 기능을 직접 확인해보며 코드를 작성하였다. 그렇게 작성된 코드는 예상치 못한 결과가 나왔을 때 코드의 수정의 어려움이 있었다. 두번째 시도로 bash 에 대해 집중적으로 공부하고 opensource 분석 후 기능적으로 파일과 함수를 분리하여 code를 작성한 결과 code 수정과 각 기능별 test또한 효율적으로 수행할 수 있었다. 이번 과제를 통해 pipe, file discriptor 관리 signal 등 여러가지 개념에 대해 복습 또한 할 수 있었지만, 코드를 전체적으로 계획하고 코드를 분석하며 opensource를 분석하면서 잘 정리된 코드와 코드 작성 스타일에 대해 생각해볼 수 있는 기회가 되었고, 함수 분리와 기능 분리의 중요성을 직접적으로 느낄 수 있었다.