자료구조
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;
흐름도
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명령어를 참조해야 한다. 언젠가 시간이 난다면 해보고싶은 프로젝트일지도?
답글 남기기