42Seoul C ๊ธฐ๋ฐ ๊ฐ๋จํ shell ๊ตฌํ
minishell์ shell์ ์ง์ ๊ตฌํํ๋ ํ๋ก์ ํธ์
๋๋ค.| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๊ธฐ๊ฐ | 2024.05 ~ 2024.06 |
| ์คํ | C Makefile readline fork() execve() pipe() dup2() |
| ํ | 2์ธ |
| ๋ด๋น | Cmd / Pipe Redirection |
readline() ๊ธฐ๋ฐ interactive shell prompt ์ ๊ณต$VAR, $? ๊ธฐ๋ฐ ๋ฌธ์์ด ์นํ<, >, >>, << ์ฒ๋ฆฌecho, cd, pwd, export, unset, env, exit ๊ตฌํPATH ํ์ ํ execve()๋ก ์ธ๋ถ ๋ช
๋ น ์คํ
readline()์ผ๋ก ์
๋ ฅ์ ๋ฐ์ ๋ค parser์ executor๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ฑฐ;, |, quote, dollar expansion, redirection ๊ธฐ์ค์ผ๋ก ํด์t_node linked list์ ์ ์ฅfork() ์คํ์ ๊ฒฐ์ ํฉ๋๋ค.execve()์ ์ ๋ฌ| Layer | Responsibility |
|---|---|
| Input | readline prompt, history ๊ด๋ฆฌ |
| Parser | quote, dollar expansion, pipe, redirection, heredoc ์ฒ๋ฆฌ |
| Node | command, path, input fd, output fd, previous error number ์ ์ฅ |
| Exec | builtin dispatch, fork, pipe, dup2, wait, execve ์ฒ๋ฆฌ |
| Env | environment linked list ์์ฑ, ์ถ๊ฐ, ์ญ์ , ๋ฐฐ์ด ๋ณํ |
| Signal | prompt, child, heredoc signal handler ๊ด๋ฆฌ |
t_node๋ก ๋ณํt_node๋ cmd, path, in_fd, out_fd, prev_errnum, next๋ฅผ ๋ณด๊ดprocessing()์์ node ๊ฐ์๋ฅผ ๊ณ์ฐpipe()์ dup2()๋ฅผ ์ฌ์ฉํด ์๋ค command๋ฅผ ์ฐ๊ฒฐfd[1] ์ STDOUT ์ dup2() ํ ๋ค ์ฌ์ฉํ์ง ์๋ pipe fd๋ฅผ ๋ซ์STDIN ์ dup2() ํด ๋ค์ cmd์ ์
๋ ฅ์ผ๋ก ๋๊ธฐ๊ณ , ๊ธฐ์กด pipe ์ ๋ฆฌSTDIN ์ ์์๋ฐ์ ์ด์ cmd์ ์ถ๋ ฅ๊ณผ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ๋จsave_stdio()/restore_stdio() ๋ก shell์ ์๋ ํ์ค ์
์ถ๋ ฅ์ ๋ณต๊ตฌcd, export, unset, exit์ฒ๋ผ shell ์ํ๋ฅผ ๋ฐ๊พธ๋ ๋ช
๋ น์ ๋ถ๋ชจ ํ๋ก์ธ์ค์์ ์ฒ๋ฆฌํด์ผ ํจfork() ์ดํ child process์์ ์คํํด์ผ ํจis_builtin()์ผ๋ก builtin ์ฌ๋ถ ํ๋ณfind_path()๋ก ์คํ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ค execve() ํธ์ถecho, cd, pwd, export, unset, env, exit