Minishell Deep Dive

자료구조

typedef enum e_type
{
        PIPE,
        INPUT_REDIR,
        APPEND_REDIR,
        OUTPUT_REDIR,
        HEREDOC,
        CMD,
        FILENAME
}               t_type;

typedef struct s_token
{
        char                    *token;
        t_type                  type;
        struct s_token  *next;
}                                       t_token;

typedef struct s_data
{
        char                    **envp;
        char                    **argv;
        char                    *init_homepath;
        t_token                 *zero_token;
        struct s_data   *next;
        int                             num_pipe;
        int                             last_in;
        int                             last_out;
        char                    *pwd;
}                                       t_data;

흐름도

https://www.mermaidchart.com/app/projects/3715600d-bbc3-4e03-9efc-76ffc1a436ce/diagrams/10c1defc-76b7-4ceb-8b4f-4c94dec88d80/version/v0.1/edit

Minishell 프로젝트에서 사용한 자료구조는 위와 같다. t_data는 단방향 연결리스트이다. 개념적으로 파이프로 구문된 한 단락의 명령어를 담고있다. envp와 argv는 main함수를 통해 입력된 환경변수와 문자열의 주소를 그대로 입력한다.

init_homepath는 프로그램이 실행될 시 최초로 입력됐던 homepath의 경로이다. (쉘 명령어 입력시 ‘~’ 문자를 구현하기 위해 사용되었다.)

zero_token은 단방향 연결리스트로 구현된 t_token 구조체의 head이다. 한 단락 내에서 공백으로 구분된 단어를 의미한다. num_pipe는 전체 파이프의 갯수이다.

last_in과 last_out은 파일디스크립터를 위한 변로젝트에서 사용한 자료구조는 위와 같다.

t_data는 단방향 연결리스트이다. 개념적으로 파이프로 구문된 한 단락의 명령어를 담고있다.

envp와 argv는 main함수를 통해 입력된 환경변수와 문자열의 주소를 그대로 입력한다.

init_homepath는 프로그램이 실행될 시 최초로 입력됐던 homepath의 경로이다. (쉘 명령어 입력시 ‘~’ 문자를 구현하기 위해 사용되었다.)

zero_token은 단방향 연결리스트로 구현된 t_token 구조체의 head이다. 한 단락 내에서 공백으로 구분된 단어를 의미한다.

num_pipe는 전체 파이프의 갯수이다.

last_in과 last_out은 파일디스크립터를 위한 변수이다. pwd는 현재 디렉토리의 경로를 담고있다.

g_signul_num은 전역변수이다. C를 배우면서 처음으로 전역변수를 사용해봤다. 사실 지금 과제를 마칠때 쯤엔 전역변수 없이도 return을 적절히 사용하는 것 만으로도 구조를 짜는게 가능하다고 생각하게 됐다. 그러나 그 시점엔 이미 진행이 너무 많이 됐었기 때문에 그냥 진행했다. 프로젝트 카테고리에서도 언급 했듯이 과제를 진행한 처음에는 signul과 exit code의 구분이 모호했다. 그래서 전역변수가 저런 이름이 됐다. 사실, signul_num 이 아니고 exit code를 main함수에게 전달하기 위한 전역변수이다.

빌트인 명령어에서 의외로 까다로웠던 것은 cd명령어이다. 처음엔 그냥 chdir 쓰면 그만이지 않나? 했지만 엣지케이스가 상당히 많았다. 물론 잘 알려진 엣지케이스가 있었기 때문에, 그에 맞춰 코딩한 부분도 있다. 제대로 만드려면 bash 공식문서의 cd명령어를 참조해야 한다. 언젠가 시간이 난다면 해보고싶은 프로젝트일지도?

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다