https://github.com/parkjbdev/SCE213_OS/tree/os-pa1
Logic
mash.c
flowchart LR
initialize --> while --> get_command --command--> parse_command -- nr_tokens, tokens --> run_command --> free_command_tokens --> if_terminate
if_terminate{{run_command != 0}} --true--> while
if_terminate --false--> finalize
mash.c
์์๋ command๋ฅผ ์คํํ๊ธฐ ์ ์ command๋ฅผ ์
๋ ฅ๋ฐ๊ณ , ์ด๋ฅผ parser.c
์ ์ ์๋ parse_command
ํจ์๋ฅผ ํตํด ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก command๋ฅผ ํ ํฐํํ์ฌ run_command
์ ์ ๋ฌํ์ฌ command๋ฅผ ์คํํ ๋ค, ๋ฉ๋ชจ๋ฆฌ์์ token๋ค์ ํด์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ์ flowchart์ ๊ทธ ๊ณผ์ ๊ณผ ์ธ์๋ค์ ์ ๋ฌ์ ๋ชจ์ํํด๋์๋ค.
pa1.c
flowchart TD
START --> strcmp{{"tokens[0]"}}
strcmp --exit--> exit[return 0]
strcmp --cd--> cd[builtin_cd]
strcmp --alias--> alias[builtin_alias]
strcmp --else--> replace_alias --> execute
pa1.c
์์๋ ์ฐ์ ์ฒซ๋ฒ์งธ ์
๋ ฅ๋ ํ ํฐ tokens[0]
๊ฐ builtin function์ธ์ง ํ๋จํ์ฌ, builtin function์ผ ๊ฒฝ์ฐ nr_tokens
์ ๋ฐ๋ผ ์ฌ๋ฐ๋ฅธ ๋์์ ์ํํ ์ ์๋๋ก ํ์๋ค. builtin function์ด ์๋ ๊ฒฝ์ฐ, ์ฆ, ๋ช
๋ น์ด๋ฅผ ์คํํด์ผ ๋ ๊ฒฝ์ฐ์๋ ์ฐ์ alias๋ก ๋ฑ๋ก๋ token์ด ์๋์ง ํ์ธํ์ฌ ์ด๋ฅผ ๋์ฒดํ๋ ๊ณผ์ ์ ๊ฑฐ์น ํ execute
ํจ์๋ฅผ ํตํด ์คํํ๊ฒ ๋๋ค. ์๋ ๊ฐ๋จํ flowchart์ด๋ค. ๊ฐ๊ฐ์ ํจ์์ ๋์๊ณผ์ ์ ๋ํด์๋ ์๋์ ๊ธฐ์ ํ์๋ค.
Features
Builtin Command - cd
cd ๊ธฐ๋ฅ์ ํ์ฌ์ working directory๋ฅผ ๋ฐ๊พธ๋ ๋ช
๋ น์ด๋ก, builtin_cd
ํจ์๋ก ์คํ๋๋๋ฐ, ์ธ์๋ก ๋ณ๊ฒฝํ ๋๋ ํ ๋ฆฌ์ ์ฃผ์ dir
์ด ์
๋ ฅ๋๋ฉด, ์ด์ ๋ง๋ ๊ณณ์ผ๋ก ์ด๋ํ๋ค.
์ ๋ฌ๋ ์ธ์๊ฐ ~
์ผ ๊ฒฝ์ฐ getenv
๋ฅผ ์ด์ฉํ์ฌ ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก์ค์์ $HOME
ํ๊ฒฝ๋ณ์๋ฅผ ์ฐพ์ home directory ๋ก ์ด๋ํ ์ ์๋๋ก ํ์๋ค. ๋, cd
๋ง ์
๋ ฅ๋์์ ๋ ์ญ์ home directory๋ก ์ด๋ํด์ผ ํ๋๋ฐ, ์ด๋ run_command
ํจ์์์ ์ ๋ฌ๋ ์ธ์๊ฐ 1๊ฐ์ผ ๋์๋ builtin_cd("~")
๊ฐ ์คํ๋๋๋ก ํ์ฌ ์๋ํ ๋์์ ์ํํ ์ ์๋๋ก ํ์๋ค.
cd
๋ช
๋ น์ด๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์์ ๋์ builtin_cd
ํจ์๋ 1์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ perror
๋ฅผ ํตํ ์๋ฌ๋ฉ์ธ์ง์ ํจ๊ป -1์ ๋ฐํํ๋๋ก ํ์๋ค.
์ถ๊ฐ๊ตฌํ - ์ด์ directory ์ด๋: -
์ถ๊ฐ์ ์ผ๋ก ์ ๋ฌ๋ ์ธ์๊ฐ -
์ผ ๊ฒฝ์ฐ ์ด์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ฅํด๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์๋ค. ์ด๋ฅผ ์ํด ๋๋ ํ ๋ฆฌ๋ฅผ ์ด๋ํ ๋๋ง๋ค, ํ๊ฒฝ๋ณ์์ ๋ฑ๋ก๋ $PWD
๊ฐ๊ณผ $OLDPWD
๊ฐ์ setenv
๋ฅผ ํตํด ๋ค์ ์ค์ ํ์ฌ ์ฃผ์๋ค.
Lessons Learned
cd ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉฐ ํ๊ฒฝ๋ณ์๋ฅผ ์ฝ๊ณ ์ฐ๋ getenv
, setenv
ํจ์, current working directory๋ฅผ ์ฝ๊ณ ๋ณ๊ฒฝํ๋ getcwd
, chdir
ํจ์๋ฅผ ์๊ฒ๋์๋ค.
Builtin Command - alias
alias ๊ธฐ๋ฅ์ ๊ธฐ์กด์ run_command
๋ก ์
๋ ฅ๋ tokens
์ค์ alias๋ก ๋ฑ๋ก๋์ด ์๋ token๋ค์ ๋งค์น๋๋ token๋ค๋ก ๋์ฒดํ๋ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ์๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์ ํ๋์ alias์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ตฌ์กฐ์ฒด Alias
๋ฅผ ์ ์ํ์์ผ๋ฉฐ, ํด๋น ๊ตฌ์กฐ์ฒด์ member๋ก, ๋์ฒด๋ ๋ฌธ์์ด alias
, ํด๋น alias์ ๋ํด ๋์ฒด์์ผ์ผ ํ ํ ํฐ๋ค์ ๋ฐฐ์ด tokens
, tokens
๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ nr_tokens
๋ฅผ ์ ์ํ์๋ค. ์๋ก์ด alias๋ฅผ ๋์ ํ ๋นํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ ๋, ํธ์๋ฅผ ์ํด new_alias
, delete_alias
ํจ์๋ฅผ ์ ์ํ์ฌ ์ด์ฉํ์๋ค.
๋, ์ฌ๋ฌ alias ์ ๋ณด๋ค์ ์ ์ฅํ๋ Alias
์ ๋ฐฐ์ด Alias **aliases
๊ณผ ์ด alias๋ค์ ๊ฐ์ alias_cnt
๋ฅผ ์ ์ํ์๋ค.
์ด๋ฅผ ๊ฐ๋จํ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
classDiagram
class Alias {
char* alias
int nr_tokens
char **tokens
new_alias()
delete_alias()
print_alias()
}
class Aliases {
int alias_cnt
Alias **aliases
builtin_alias_add()
builtin_alias_print()
}
์๋ก์ด alias ์ถ๊ฐ๊ณผ์ - builtin_alias_add
์๋ก์ด alias๋ฅผ ์ถ๊ฐํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
flowchart LR
builtin_alias_add --> found
found{find_alias}
found -- not found --> increase_alias_cnt[alias_cnt++] --> realloc_aliases[realloc aliases] --> add_alias[add new alias]
found -- found --> replace_alias[replace tokens and nr_tokens]
์ฆ, alias๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์, find_alias
ํจ์๋ฅผ ํตํด aliases ๋ฐฐ์ด์ ๊ธฐ์กด์ ๋ฑ๋ก๋ ๊ฐ์ ์ด๋ฆ์ alias๊ฐ ์กด์ฌํ๋์ง ํ์ธํ ํ, ๊ฐ์ alias๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ด๋ฅผ ์๋ก์ด tokens
์ nr_tokens
๋ก ๋์ฒดํ๊ณ , ๊ธฐ์กด์ ๊ฐ์ alias๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์๋ก์ด alias๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด aliases
๋ฐฐ์ด์ alias_cnt+1
๋งํผ ์ฌํ ๋นํด์ฃผ์ด ์๋ก์ด alias๋ฅผ ๋ฑ๋กํด์ฃผ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
alias ์ถ๋ ฅ - builtin_alias_print
builtin_alias_print
ํจ์๋ ์ด๊ธฐ์๋ ๋ชจ๋ alias๋ค์ ์ถ๋ ฅํ๋ ํจ์๋ก ๋ง๋ค์์ผ๋, ๊ฐ๋ณ alias์ ๋ํด์ ์ถ๋ ฅํ ์ ์๋๋ก ๊ฐ์ ํ์๋ค.
์ด๋ฅผ ์ํด run_command
์์ alias
๋ง ์
๋ ฅ๋์ด token์ด 1๊ฐ ์
๋ ฅ๋ ๊ฒฝ์ฐ, alias
์ ํจ๊นจ token์ด 2๊ฐ ์
๋ ฅ๋ ๊ฒฝ์ฐ, ์ฆ alias ll
๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด builtin_alias_add
์ ์ธ์๋ก ์ ๋ฌํ์๋ค.
ํด๋น ํจ์์ NULL
๊ฐ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ, ๋ชจ๋ alias๋ค์ ์ถ๋ ฅํ๋๋ก ํ์๊ณ , ๋ฌธ์์ด์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ ํด๋นํ๋ alias๋ฅผ find_alias
๋ฅผ ํตํด ์ฐพ์์ ์ถ๋ ฅํ๋๋ก ํ์๋ค.
alias replacement
builtin commands๊ฐ ์๋ ๊ฒฝ์ฐ, execute
์ ํตํ์ฌ command๋ฅผ ์คํํ๊ธฐ ์ ์, tokens
๋ฅผ ์ํํ๋ฉฐ alias๋ก ๋์ฒดํ token์ด ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. alias๋ก ๋์ฒดํ token์ด ์กด์ฌํ๋ค๋ฉด, ์ด๋ฅผ ๋์ฒดํ๊ธฐ ์ํด์ tokens[]
๋ฐฐ์ด์ ๋ท๋ถ๋ถ์ alias์ token ๊ฐ์๋งํผ ๋ฏธ๋ฃจ๋ ์์
์ ์งํํ๋ค.
๊ทธ๋ฆฌ๊ณ alias๊ฐ ์๋ index๋ถํฐ ๋ฏธ๋ค์ง ๋งํผ์ index์ alias token๋ค์ ๋ฃ๋๊ณผ์ ์ ์งํํ๋ค.
์ต์ข
์ ์ผ๋ก, aliasing ๋ token๋ค์ aliasing์ ๋ฐฉ์งํ๊ธฐ ์ํด for loop์ ์ํํ๋ iterator i
๋ฅผ ๋ฐ์ด๋ธ ์ธ๋ฑ์ค๋งํผ ์ฆ๊ฐ์์ผ ์ฃผ์๋ค. (ex. alias hello hi hello; echo hello world ์ ์คํ๊ฒฐ๊ณผ๋ hi hello world ์ฌ์ผ ํจ, re-aliasing์ ํ ๊ฒฝ์ฐ ๋ฌดํํ ๊ธด ๋ฌธ์์ด์ด ์์ฑ๋จ)
๋ฉ๋ชจ๋ฆฌ ํด์
์ต์ข
์ ์ผ๋ก ์์ terminateํ๊ธฐ ์ ์ ๋์ ํ ๋นํ aliases
์ ๊ฐ๋ณ element์ aliases
์ finalize
ํจ์์์ ํด์ ํด์ฃผ์๋ค.
Lessons Learned
alias ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ๊ณ ํด์ ํ๋ ๊ณผ์ ์ ํตํด ํฌ์ธํฐ์ ์ด๋ฅผ ํ์ฉํ ๋์ ๊ธธ์ด๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ ๋ํ ์ดํด๋๋ฅผ ํฅ์์ํฌ ์ ์์๋ค.
ํนํ, ๋ฌธ์์ด์ ๋ณต์ฌํ ๋, ๊ธฐ์กด์๋ malloc
์ ํตํด ๋ฌธ์์ด์ ์ ์ฅํ๋ ๊ณต๊ฐ์ ๋์ ์ผ๋ก ๋ง๋ค๊ณ , ์ฌ๊ธฐ์ strcpy
๋ฅผ ํตํด ๋ณต์ฌํ๊ณ ๋ ํ์๋๋ฐ, ์ด๋ฅผ ํ๋ฒ์ ํด์ฃผ๋ strdup
์ด๋ผ๋ ์ ์ฉํ ํจ์๋ฅผ ์๊ฒ๋์๋ค.
Execution & Pipe Implementation - execute
์๋ก์ด ํ๋ก์ธ์ค์ ์คํ๊ณผ pipelining ๋ถ๋ถ์ logic์์ ๊ฒน์น๋ ๋ถ๋ถ์ด ๋ฐ์ํ์ฌ ๊ฐ์ section์ผ๋ก ํฌํจํ๋ค.
์ฐ์ execute
์ ์คํํ๊ธฐ ์ ์, tokens
์ nr_tokens
๋ฅผ ์
๋ ฅ๋ฐ์ ์ด๋ฅผ ํ์ดํ๋ผ์ธ ๊ธฐํธ |
๋จ์๋ก ๋๋์ด command ๋จ์๋ก ํ ํฐ๋ค์ ๋ถ๋ฆฌ์์ผฐ๋ค.
ํด๋น ๊ณผ์ ์ parse_commands
์์ ์ํ๋๋ค. ๋ช
๋ น์ด ๋จ์๋ก ๋ถ๋ฆฌ๋ ํ ํฐ๋ค์ ์ ์ฅํ๋ ๊ตฌ์กฐ์ฒด Command
๋ฅผ ์ ์ํ์์ผ๋ฉฐ, ์ฌ๋ฌ ๋ช
๋ น์ด๋ค์ ๋ํ list
์ ๋ช
๋ น์ด์ ๊ฐฏ์ nr_commands
๊ฐ ์ ์๋ ๊ตฌ์กฐ์ฒด Commands
๋ฅผ ์ ์ํ์๋ค. parse_commands
์ ๊ฒฐ๊ณผ๋ก commands
๋ฅผ ๋ฐ์, commands->list[i]->tokens
๋จ์๋ณ๋ก exec_command
์์ execvp
๋ฅผ ํตํด ์คํํ๊ฒ ๋๋ค.
Execution
Pipelining์ด ์๋ execution์ ๊ฒฝ์ฐ ์ด์ ์ pipeline์ ๊ตฌํํ์ง ์์ ์ํ์ธ 50783ff4
์ปค๋ฐ์ 170๋ผ์ธ ๋๋, ์ต์ข
์ปค๋ฐ์ execution
ํจ์์ ๋ง์ง๋ง fork์ดํ ๊ณผ์ ์์ ์ด์ค์ผ๋ก ๊ฐ์ธ์ง if ๋ฌธ์ ์ ์ธํ๊ณ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๋ฉด ๋๋ค.
์ฆ, ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์ ์ฒด์ ์ธ ๊ณผ์ ์ fork
๋ฅผ ์งํํ์ฌ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ฌํ ๋ค, child process์์๋ execvp
ํจ์๋ฅผ ํธ์ถํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์คํ์ํค๊ณ , exit
ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ณ , parent process์์๋ child process๊ฐ exit
๋๋ ๊ฒ์ wait
ํจ์๋ฅผ ํตํด ๋๊ธฐํ๋ค.
๊ทธ ๊ณผ์ ์ flowchart๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
flowchart LR
START -->
last_fork{{pid=fork}}
last_fork --pid<0--> fork_error[fork_failed]
last_fork --pid==0--> child[Child]
child --> execute --> exit
last_fork --pid>0--> par[Parent] --> wait
wait-.-exit
wait --> RETURN
PipeLining
flowchart TD
START -->
parse_commands --> pipe --> is_last_command{{no pipeline?}} --false-->for_commands
is_last_command--true-->last_command
for_fork_par_close_write --> last_command --> last_fork{{pid=fork}}
last_fork --pid<0--> fork_error[fork_failed]
last_fork --pid==0--> child[Child]
child --> were_pipelines{{pipeline exists?}}
were_pipelines --false-->execute-->exit
were_pipelines --true-->child_dup_read
child_dup_read["dup2 pipe_fd[0] as STDIN"] --> close_read[close read end of pipe] --> execute
last_fork --pid>0--> par[Parent] --> wait
wait-.-exit
wait --> RETURN
subgraph for commands except last one
direction TB
for_commands[for commands except last one]-->for_fork{{pid=fork}}
for_fork --pid<0 --> for_fork_error[fork failed]
for_fork --pid==0--> for_fork_child[Child] --> is_first_command
for_fork --pid>0--> for_fork_par[Parent] --> for_fork_par_wait[wait] --> for_fork_par_close_write[close write end of pipe] --> for_commands
for_exit -.- for_fork_par_wait
subgraph child_process
direction TB
is_first_command{{is it first command?}} --true--> for_child_dup_read["dup2 pipe_fd[0] as STDIN"]
-->for_child_dup_write
is_first_command --false-->for_child_dup_write["dup2 pipe_fd[1] as STDOUT"]-->close_child_read[close read end of the pipe]-->for_execute[execute] --> for_exit[exit]
end
end
TestCase์๋ ํ์ดํ๋ผ์ด๋์ด ํ๋์ธ ์ผ์ด์ค๋ง ์กด์ฌํ๋๊ฒ ๊ฐ์์ผ๋, Multi Pipeline์ ์ง์ํ๊ธฐ ์ํด command ๋จ์๋ณ๋ก for loop์ ์ํํ๋ฉฐ ํ๋ก์ธ์ค๋ฅผ ์คํ์์ผฐ๋ค. ๊ทธ ๊ณผ์ ์ flowchart๋ก ๊ทธ๋ ค๋ณด์์ผ๋, ๊ณผ์ ์ ๋นํด ๋ ๋ณต์กํ๊ฒ ๋ณด์ด๋ฏ๋ก, ์ฒจ๋ถํ์ง๋ ์์๋ค. (gitlab REPORT.md ์ฐธ์กฐ)
์ ์ฒด์ ์ธ ํ๋ฆ์ ์์์ ์ธ๊ธํ Execution ๊ณผ์ ๊ณผ ๋์ผํ๋, pipe
ํจ์๋ฅผ ํตํด pipe๋ฅผ ์์ฑํ๊ณ dup2
๋ฅผ ํตํด pipe์ read end๋ฅผ stdin์ผ๋ก ํน์ pipe์ write end๋ฅผ stdout์ผ๋ก ์ง์ ํ๋ ๊ณผ์ , pipe๋ฅผ ์ฌ๋ซ๋ ๊ณผ์ ๋ฑ์ด ์ถ๊ฐ๋๋ค. ์ผ๋ฐ์ ์ธ ๋๋ถ๋ถ์ ํ๋ก์ธ์ค๋ค์ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ stdin์์ ๋ฐ๊ฑฐ๋ stdout์ผ๋ก ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์, pipe๋ฅผ ์ด์ฉํ์ฌ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ ๋ฌํ๋ ๋ฐ์ dup2
ํจ์๊ฐ ์ฌ์ฉ๋๋ค.
์์ ํ๋ก์ธ์ค์์๋ ๋จผ์ , pipe๋ฅผ ์์ฑํ ๋ค, |
์ ํตํด ๊ตฌ๋ถ๋ ๋ช
๋ น์ด ๋จ์๋ก ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ค.
๊ทธ๋ฆฌ๊ณ , child process์์, dup2
๋ฅผ ์ด์ฉํ์ฌ stdin์ผ๋ก ๋ค์ด์์ ์
๋ ฅ ๋์ pipe์ read_end์ธ pipe_fd[0]
์์ ์
๋ ฅ์ ๋ฐ์์ค๊ณ , stdout์ ์ถ๋ ฅ๋ ์ถ๋ ฅ์ pipe์ write_end์ธ pipe_fd[1]
์ ์
๋ ฅ๋๋๋ก ํ๋ค. ๋จ, ์ฒซ๋ฒ์งธ๋ก ์คํํ๋ ํ๋ก์ธ์ค์ผ ๊ฒฝ์ฐ์๋ stdin์์ ๋ฐ์์ฌ ์
๋ ฅ์ด ์๊ธฐ ๋๋ฌธ์ stdin ๋์ pipe_fd[0]
์์ ์
๋ ฅ์ ๋ฐ์์ค๋ ๋์์ ์๋ตํ๋ค.
์
๋ ฅ์ ๋ฐ์์จ ๋ค์๋ ์ถ๋ ฅ์ pipe์ write_end์ ์์ฑํ๊ธฐ ์ํด์ read_end๋ฅผ ๋ซ์์ค๋ค.
๋ถ๋ชจ ํ๋ก์ธ์ค์์๋ ์์ ํ๋ก์ธ์ค๊ฐ ์คํ๋ ๋ค, pipe์ write_end์ธ pipe_fd[1]
์ ๋ซ์์ฃผ์ด pipe์ EOF์์ ์ ๋ฌํ๋๋ก ํ์๋ค.
์ฆ, ์ ์ฒด์ ์ผ๋ก ๋ณด์์ ๋, ํ์ดํ๋ผ์ธ์ ํตํ์ฌ n๊ฐ์ command๊ฐ ์
๋ ฅ๋์์ ๋, ๊ฐ command๋ฅผ ์คํํ๊ธฐ ์ํด n๋ฒ์ fork
๊ฐ ์ผ์ด๋๋ค.
์์๋ก, ls -al | wc -l | cat
์ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์์ ๋, command ๋ณ๋ก ์ด๋ฅผ [["ls", "-al"], ["wc", "-l"], ["cat"]]
์ ๊ฐ์ด parsing ํด๋ด๊ณ , ์์ฐจ์ ์ผ๋ก ls -al
๋ช
๋ น์ ์คํํ๊ธฐ ์ํด fork
ํ execvp
ํ ๊ฒฐ๊ณผ๋ฅผ pipe_fd[1]
์ ๋ฃ๊ณ , pipe_fd[0]
์์ wc -l
์ด ์ด๋ฅผ ์ฝ์ด์ fork
ํ execvp
ํ์ฌ ์คํํ ๊ฒฐ๊ณผํ pipe_fd[1]
์ ๋ฃ๊ณ , pipe_fd[0]
์์ cat
์ด ์ด๋ฅผ ์ฝ์ด์ fork
ํ execvp
ํ ๊ฒฐ๊ณผ๋ฅผ ์ต์ข
์ ์ผ๋ก stdout์ผ๋ก ์ถ๋ ฅํ๋ค. ์ฆ ์ด์ ๊ฐ์ ๊ฒฝ์ฐ์์๋ 3๋ฒ์ fork
๋ฅผ ํตํด ํ๋ก์ธ์ค๊ฐ ์คํ๋์๋ค.
์ด์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ ์ด์ ํ๋ก์ธ์ค์ ์ถ๋ ฅ์ด ํ์ดํ์ ์์ฑ๋๊ณ , ์ด๋ฅผ ๋ค์ ํ๋ก์ธ์ค๊ฐ ํ์ดํ์์ ์ฝ์ด์ pipelining์ด ๊ตฌํ๋ ์ ์๋๋ก ํ์๋ค.
Lessons Learned
ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋ํด์ ์๊ฒ ๋์๋ค. ๋จ์ํ exec
๋ฅผ ํตํด ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ก ์คํํ๊ฒ ๋ ๊ฒฝ์ฐ์๋, ์๋ก์ด ํ๋ก์ธ์ค๋ก ์คํ๋๋ ๊ฒ์ด ์๋, ํ์ฌ ์ฌ์ฉ์ค์ธ ํ๋ก์ธ์ค์์ ์๋ก์ด ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ด์ ์ ์ํ๋ฅผ ์ ์ฅํ ์ํ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ์ํด fork
๋ผ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ํ์ฌ ํ๋ก์ธ์ค๋ฅผ ๊ทธ๋๋ก ๋ณต์ ํ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ๋ค, ์์ ํ๋ก์ธ์ค์์ exec
๋ฅผ ํตํด ์คํํ๊ฒ ๋๋ค. ์์ ํ๋ก์ธ์ค๊ฐ exit
ํ๋ฉด, wait
์ ํตํด ๋ถ๋ชจํ๋ก์ธ์ค๋ ์์ํ๋ก์ธ์ค๊ฐ ๋๋ฌ์์ ํ์ธํ๊ณ ๊ทธ๋๋ก ๋์์ ์งํํ ์ ์๋ค.
ํ์ดํ๋ผ์ธ์ผ๋ก ์ฐ๊ฒฐ๋ inter process communication ๊ธฐ๋ฒ์ ๋ํด์๋ ์ง์ ํ์ดํ ์ฌ์ฉํด๋ณด๋ฉฐ ์ ์ ์์๋ค. pipe file descriptor์ 0๋ฒ์งธ index๋ pipe์ read end๋ก pipe์์ ์ฝ์ด์ค๋ ์ญํ ์, 1๋ฒ์งธ index๋ pipe์ write end๋ก pipe์ ์
๋ ฅํ๋ ์ญํ ์ ํ๋ค. ํ์ดํ๋ฅผ ์ฌ์ฉํ ๋, dup2
๋ฅผ ์ด์ฉํ์ฌ stdin์ ์
๋ ฅ์ pipe์ read end์์ ์
๋ ฅ๋ฐ๊ณ , stdout์ ์ถ๋ ฅ์ pipe์ write end์ ์์ฑํจ์ผ๋ก์จ pipe๋ฅผ ํตํ์ฌ ํ๋ก์ธ์ค๊ฐ ํต์ ์ ์งํํ ์ ์์๋ค. ๋๋ฒ๊น
์ค์ ๊ฐ๋ ํ๋ก๊ทธ๋จ์ด ๊ฐ๋งํ ๋ฉ์ถฐ์๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ์๋๋ฐ, ์ด๋ ํ์ดํ๋ฅผ ์ ์์ ์ผ๋ก ๋ซ์์ฃผ์ง ์์ EOF๋ฅผ ๋๊ธฐํ๋ ์ํฉ์ด์์์ ์ ์ ์์๋ค.