๐Ÿ’ป Minishell: ์šด์˜์ฒด์ œ์˜ ์ถ•์†ŒํŒ, ํ…์ŠคํŠธ์™€ ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์˜ ๋ฒˆ์—ญ๊ฐ€๋ฅผ ์ž์ฒ˜ํ•˜๋‹ค

ํ†ต๊ณก์˜ ๋ฒฝ. ์ˆ˜ ๋งŽ์€ 42์„œ์šธ์˜ ๊ณผ์ œ๋“ค ๊ณผ์ •์—์„œ๋„, ์—ญ๋Œ€๊ธ‰์œผ๋กœ ๊ณ ๋ฏผํ•˜๊ณ , ์†Œํ†ตํ•  ์ผ์ด ๋งŽ์•„์ง€๋Š” ํ”„๋กœ์ ํŠธ. ์‰ฝ์ง€ ์•Š์•˜๋˜ ์ด ํ”„๋กœ์ ํŠธ๋Š” ์ง€๊ธˆ๋„ ๋‘๊ณ ๋‘๊ณ  ์ƒ๊ฐ๋‚˜๋Š”, ์ •๋ง ์‰ฝ์ง€ ์•Š์€ โ€˜ํ—˜ํ•œ ๊ฒƒโ€™ ์ด์—ˆ๋‹ค.

์ด์ „์˜ ๊ณผ์ œ๋“ค์ด ๊ฐœ๋ณ„์ ์ธ ์‹œ์Šคํ…œ ์ฝœ์ด๋‚˜ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊นŠ๊ฒŒ ํŒŒ๊ณ ๋“œ๋Š” ๊ฒฝํ—˜์ด์—ˆ๋‹ค๋ฉด, Minishell์€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์•„์šฐ๋ฅด๋Š” ํ•˜๋‚˜์˜ ์ž‘์€ ์šด์˜์ฒด์ œ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ์ข…ํ•ฉ์ ์ธ ๊ณผ์ œ์ด๋‹ค.

์…ธ(Shell)์€ ๋‹จ์ˆœํžˆ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋„˜์–ด, ์ปค๋„(Kernel)์ด๋ผ๋Š” ์‹œ์Šคํ…œ์˜ ์‹ฌ์žฅ๋ถ€์™€ ์‚ฌ์šฉ์ž ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ •๊ตํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด์ž ๋ฒˆ์—ญ๊ฐ€์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ•œ ์ค„์˜ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์ด ์–ด๋–ป๊ฒŒ ์ƒ๋ช…๋ ฅ์„ ์–ป์–ด ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ ํ˜‘์—ฐ์œผ๋กœ ์žฌํƒ„์ƒํ•˜๋Š”์ง€, ๊ทธ ๋ชจ๋“  ๊ณผ์ •์„ ์ง์ ‘ ์ง€ํœ˜ํ•ด์•ผ ํ•˜๋Š”, ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ์„œ์˜ ์ง„์ •ํ•œ ์—ญ๋Ÿ‰์„ ์‹œํ—˜๋ฐ›๋Š” ํ”„๋กœ์ ํŠธ์ด๋‹ค.

Minishell์€ โ€œ์–ด๋–ป๊ฒŒ ๋ฌธ์ž์—ด์„ ํ•ด์„ํ•˜๊ณ (Parsing), ์–ด๋–ป๊ฒŒ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ(Process Management), ์–ด๋–ป๊ฒŒ ๊ทธ๋“ค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ œ์–ดํ•  ๊ฒƒ์ธ๊ฐ€(IPC & I/O Redirection)โ€๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ๊ฑฐ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ์ฐพ์•„๊ฐ€๋Š” ์—ฌ์ •์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์— ํ•œ ์Šคํ‘ผ ๋”.

์ด ๊ณผ์ œ๋Š” 42์„œ์šธ์—์„œ์˜ ๋ณธ ๊ณผ์ •์—์„œ์˜ ์ตœ์ดˆ ํŒ€ ๊ณผ์ œ์ด๋‹ค.


๐Ÿ“ž 0๋‹จ๊ณ„: ํ˜‘์—… ๊ธธ ๋“ค์ด๊ธฐ

์ฒ˜์Œ ์ˆ˜ํ–‰ํ•œ ํ˜‘์—…์˜ ์‹œ์ž‘์€ ์ •๋ง๋กœ โ€˜์–ด์ƒ‰โ€™ ํ–ˆ๋‹ค.

์ฒ˜์Œ ๋งˆ์ง€ํ•˜๋Š” git, ๋ฒ„์ „๊ด€๋ฆฌ, git ์ „๋žต๊ณผ ๊ฐ™์€ ๋‚ด์šฉ๋“ค์€ ์ƒ์†Œํ•œ๋ฐ, ์‹ฌ์ง€์–ด โ€˜์ผโ€™์ด ์•„๋‹ˆ๋ผ โ€˜๋ฐฐ์›€โ€™์ด๋ž€ ์ฐจ์›์—์„œ ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‹ค๋ณด๋‹ˆ ์—ฌ๋Ÿฟ์˜ ์ƒ๊ฐ์ด๋‚˜, ์ฃผ์žฅ์ด ์ด์–ด์กŒ๊ณ  ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค ์†์—์„œ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ง€๋Š” ์ •๋ง ์–ด๋ ค์šด ์ผ์ด์—ˆ๋‹ค. ๊ทธ๋‚˜๋งˆ 2๋ช…์ด ํ•œ๋‹ค๋Š” ์ ์—์„œ, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๊ฐ€ ๋ณธ๊ฒฉ์ ์ธ ํ˜‘์—…์ด๋ผ๊ธฐ ๋ณด๋‹จ, โ€˜ํ˜‘์—… ๋ง›๋ณด๊ธฐโ€™ ๋ผ๋Š” ์ปจ์…‰์ด๋ผ๋Š” ์ฐจ์›์—์„œ ๋ณธ๋‹ค๋ฉด ๊ทธ๋‚˜๋งˆ ๊ดœ์ฐฎ์•˜๋‹ค๊ณ  ๋ณธ๋‹ค.

์šฐ์„ , ์ƒ๋Œ€๋ฅผ ํŒŒ์•…ํ–ˆ๋‹ค. ์ƒ๋Œ€์˜ ํ‘œํ˜„, ์ƒ๋Œ€๊ฐ€ ๋ฐ”๋ผ๋Š” ๋ฐ”, ํŠนํžˆ๋‚˜ ๋ชฉํ‘œ๊ฐ€ ๋™์ผํ•˜๋‹ค๊ณ  ํ•ด๋„, ๊ทธ ๋™์ผํ•œ ๋ชฉํ‘œ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋„ ๋งŽ์•˜๋‹ค. ํŠนํžˆ๋‚˜ ์‹ ๊ฒฝ ์“ด ๊ฒƒ์€ โ€˜ํ‘œํ˜„โ€™์˜ ์ •๊ตํ™”๋‹ค.

ํ•œ์ชฝ์ด ์•„๋ฌด๋ฆฌ ์ง€์‹์ด ๋›ฐ์–ด๋‚˜๋„, ํ˜‘์—…์„ ํ•ด์„œ ํšจ์œจ์„ ๋‚ด๋ ค๋ฉด, ์ƒ๋Œ€๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ง๋กœ ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ , ์‹ค์ œ๋กœ ํ”„๋กœ์„ธ์Šค ๊ณผ์ •์—์„œ ์•ฝ์†๋œ ์–ธ์–ด๋กœ ํ•œ๋‹ค๋Š” ๋ง์€ ์ •๋ณด์˜ ๊ณต์œ  ์ˆ˜์ค€๋„ ๋น„์Šทํ•ด์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ๋‹ค.

๊ธฐ์ˆ ์ ์ธ ์ „๋žต์œผ๋กœ ๊นƒ ๋ธŒ๋žœ์น˜ ์ „๋žต, PR ์‹œ ์–ด๋–ป๊ฒŒ ํ• ์ง€โ€ฆ ๋“ฑ ์ฒ˜์Œ ํ•˜๋Š” ๊ฒƒ์ธ ๋งŒํผ, ํŒ€์›๊ณผ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ git ์˜ ํ˜‘์—… ๊ด€๋ จ ์„œ์ ์„ ๋ณด๋ฉด์„œ, ๊ฐ€์žฅ ์ตœ์„ ์ด ๋ญ˜๊นŒ ๊ณ ๋ฏผํ–ˆ์—ˆ๋‹ค.

์‚ฌ์‹ค, ์ด ๋‚ด์šฉ์„ ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ •๋ฆฌํ•œ๋‹ค๋ฉด ์—„์ฒญ๋‚œ ์ผ์ด ๋  ๊ฑฐ๋‹ค. ๊ฑฐ์˜ ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ 3๊ฐœ์›”๊ฐ„ ์ˆ˜ํ–‰ํ–ˆ๋˜๊ฑธ ์ƒ๊ฐํ•˜๋ฉด, ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋Œ€ํ™”์™€ ์†Œํ†ต, ํŠนํžˆ ๊ฑฐ๊ธฐ์„œ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฑธ๋กœ ํ•ด์•ผ ํšจ์œจ์ ์ผ์ง€ ๋…ผํ•˜๋˜ ์‹œ๊ฐ„๋“ค์€ ์ง€๊ธˆ ์ƒ๊ฐํ•˜๋ฉด ๋ฌด์ฒ™ ๊ฐ’์ง„ ์ผ์ด์—ˆ์ง€๋งŒ ๋™์‹œ์— ํž˜๋“  ๊ณผ์ •์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ๋‚˜๋งˆ ์œ„์•ˆ์€ 42์„œ์šธ์˜ ํ•™์ƒ๋“ค ์ƒ๋‹น ์ˆ˜๊ฐ€ ๊ฐœ๋ฐœ์ž์˜ ๊ฐ€๋Šฅ์„ฑ, ์„ฑํ–ฅ, ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ์—ด์ •๊ณผ ์žฌ๋ฏธ๋ฅผ ๋А๋ผ๋Š” ์ด๋“ค์ด์—ˆ๊ธฐ์— ๊ทธ๋Ÿฐ ์ ๋“ค์ด ์šฐ๋ฆฌ๋ฅผ ๋ฌถ์–ด์ฃผ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.


๐Ÿ“œ 1๋‹จ๊ณ„: ๋ฌธ์ž์—ด ํ•ด์„ (Parsing) - ๋ฌด์˜๋ฏธํ•œ ํ…์ŠคํŠธ์—์„œ ์˜๋ฏธ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ

๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ๋“ค์–ด๊ฐ€๋ฉด ์…ธ์˜ ์ฒซ ๋ฒˆ์งธ ์ž„๋ฌด๋Š” ๋ช…๋ น์–ด๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ ์ธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ls -al | grep "main" > result.txt์™€ ๊ฐ™์ด ์•ฝ์†๋œ ๋ช…๋ น์–ด๋“ค์˜ ๋‚˜์—ด์ด์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ์ด ๋ช…๋ น์–ด๋ฅผ ์•Œ์•„๋“ฃ๋‚˜? ์•„๋‹ˆ๋‹ค. ์‹ค์งˆ ํ„ฐ๋ฏธ๋„์—์„œ ์น˜๋Š” ๋‚ด์šฉ์„ ์ปดํ“จํ„ฐ๋Š” ์•Œ์•„๋“ฃ์ง€ ๋ชปํ•œ๋‹ค. 0, 1์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ โ€˜์ดํ•ด์‹œํ‚ค๋Š”โ€™ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ณ  ์ด๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ, ํฌ๊ฒŒ ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰œ๋‹ค.

  1. ์–ดํœ˜ ๋ถ„์„ (Lexical Analysis / Tokenization): ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด์„ ls, -al, |, grep, "main", >, result.txt ์™€ ๊ฐ™์ด ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ์ตœ์†Œ ๋‹จ์œ„์ธ ํ† ํฐ(Token)์œผ๋กœ ๋ถ„ํ•ดํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๊ณต๋ฐฑ์€ ๋ถ„๋ฆฌ์˜ ๊ธฐ์ค€์ด ๋˜๋ฉฐ, ํŒŒ์ดํ”„(|)๋‚˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜(>, <) ๊ฐ™์€ ํŠน์ˆ˜ ๋ฌธ์ž๋Š” โ€˜์—ฐ์‚ฐ์žโ€™ ํ† ํฐ์œผ๋กœ, ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ๋ฌธ์ž์—ด์€ ํ•˜๋‚˜์˜ ๋‹จ์ผ ํ† ํฐ์œผ๋กœ ์ธ์‹ํ•˜๋Š” ๋“ฑ ์ •๊ตํ•œ ๊ทœ์น™์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™๋“ค์€ ์š”๊ตฌ๋˜๋Š” ์กฐ๊ฑด๋“ค, ์‰˜์˜ ๊ธฐ๋ณธ ๋™์ž‘์—๋Œ€ํ•œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์ „๋ถ€ ๊ธฐ์ˆ ํ™”ํ•˜์˜€๋‹ค. ์•ฝ์†๋œ ์ปจ๋ฒค์…˜์˜ ์˜ˆ์•ฝ๋œ ๋‹จ์–ด๋‚˜ ๋„๊ตฌ๋“ค์— ๋Œ€ํ•ด ๋ฆฌ์ŠคํŠธ์—…์„ ํ•œ ๋’ค์—๋Š” ์šฐ์„ ์ˆœ์œ„๋‚˜ ์–ด๋–ค ๊ฑธ ์šฐ์„ ์‹œ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ€์‹œํ™” ํ•˜์˜€๋‹ค.

  2. ๊ตฌ๋ฌธ ๋ถ„์„ (Syntax Analysis / Parsing): ์ƒ์„ฑ๋œ ํ† ํฐ์˜ ๋ฐฐ์—ด์„ ๋ฐ”ํƒ•์œผ๋กœ, ๋ช…๋ น์–ด์˜ ๋ฌธ๋ฒ•์  ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(Abstract Syntax Tree, AST)์™€ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A | B > C ๋ผ๋Š” ๋ช…๋ น์–ด๋Š” โ€˜ํŒŒ์ดํ”„โ€™๋ผ๋Š” ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ , ๊ทธ ์™ผ์ชฝ ์ž์‹์œผ๋กœ๋Š” โ€˜Aโ€™๋ผ๋Š” ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด(Simple Command) ๋…ธ๋“œ๊ฐ€, ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ๋Š” โ€˜๋ฆฌ๋‹ค์ด๋ ‰์…˜โ€™ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค. ์ด ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ ๋ช…๋ น์–ด์˜ ๊ด€๊ณ„์™€ ์‹คํ–‰ ์ˆœ์„œ, ์ž…์ถœ๋ ฅ ๋ฐฉํ–ฅ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋‹ซํžˆ์ง€ ์•Š์€ ๋”ฐ์˜ดํ‘œ๋‚˜ ๋ฌธ๋ฒ•์— ๋งž์ง€ ์•Š๋Š” ํŠน์ˆ˜๋ฌธ์ž ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด๋Š” ๊ฒƒ๋„ ํŒŒ์„œ์˜ ์ค‘์š”ํ•œ ์—ญํ• ์ด๋‹ค. ํŠนํžˆ๋‚˜ ํžˆ์–ด๋…๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์œ„ํ•œ ๊ฐœ๋ณ„ ๋กœ์ง์ด ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ ๋˜๋Š”์ง€์™€ ๊ฐ™์€ ํฌ์ธํŠธ๋“ค์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์ค‘์š”ํ—ค์ง€๋ฉฐ, ์ด๋ฅผ ๊ตฌ์กฐ์ฒด๋กœ ๋‹ด์•„๋‚ด๋Š” ์ž‘์—…, ๊ทธ๋ฆฌ๊ณ  ํŠนํžˆ๋‚˜ ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ๋‹จ์œ„๋กœ ํƒ์ƒ‰์ด ํŽธ๋ฆฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ ์†๋„์—๋„ ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ์ฃผ์—ˆ๋‹ค.

  • ๋”ฐ์˜ดํ‘œ์™€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ: ํŒŒ์‹ฑ ๊ณผ์ •์—์„œ ์…ธ์˜ ๋ฏธ๋ฌ˜ํ•œ ๊ทœ์น™๋“ค์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ž‘์€๋”ฐ์˜ดํ‘œ(')**๋Š” ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ํ•ด์„ ์—†์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. **ํฐ๋”ฐ์˜ดํ‘œ(")๋Š” ๋‚ด๋ถ€์˜ $ ๋ฌธ์ž๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ธ์‹ํ•˜์—ฌ ๊ทธ ๊ฐ’์œผ๋กœ ์น˜ํ™˜(Expansion)ํ•ด์•ผ ํ•œ๋‹ค.$?์™€ ๊ฐ™์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ ๋ช…๋ น์–ด์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ˆ˜ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ› ๏ธ 2๋‹จ๊ณ„: ๋ช…๋ น์–ด ์‹คํ–‰ (Execution) - ๊ตฌ์กฐํ™”๋œ ๋ช…๋ น์— ์ƒ๋ช…์„ ๋ถˆ์–ด๋„ฃ๋‹ค

๊ตฌ๋ฌธ ๋ถ„์„์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ์‹คํ–‰ ๊ณ„ํš(AST)์„ ์ด์ œ ์ง์ ‘ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. ์‹คํ–‰๊ธฐ๋Š” ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ๋…ธ๋“œ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ , ์ด๋•Œ ๋ฆฌ๋ˆ…์Šค OS ์˜ ์ฒ ํ•™, ํ”„๋กœ์„ธ์Šค์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์ค‘์š”ํ•ด์ง„๋‹ค.

  1. ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ (fork): ls, grep๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด fork() ์‹œ์Šคํ…œ ์ฝœ๋กœ ํ˜„์žฌ ์…ธ ํ”„๋กœ์„ธ์Šค์™€ ๋˜‘๊ฐ™์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” execve() ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์ž๊ธฐ ์ž์‹ ์„ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ(ls ๋“ฑ)์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค(์…ธ)๋Š” waitpid()๋ฅผ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€, ์ข…๋ฃŒ์™€ ํ•จ๊ป˜ ์ œ์–ด๊ถŒ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์™€ ๋‹ค์Œ ๋ช…๋ น์„ ๋ฐ›์„ ์ค€๋น„๋ฅผ ํ•œ๋‹ค. ์ด๋•Œ ํŠนํžˆ๋‚˜ ์—๋Ÿฌํ•ธ๋“ค๋ง์„ ์ž˜ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๊ณ , ์ ์ ˆํ•œ ๋ฌธ๊ตฌ๋ฅผ ํ†ตํ•ด ๋ช…๋ น์ด ์™œ ์‹คํŒจํ–ˆ๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋Š”๊ฒŒ, ๋””๋ฒ„๊น…์˜ ํ•ต์‹ฌ์ด์—ˆ๋‹ค.

  2. ํŒŒ์ดํ”„ (|) - ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  (IPC): pipe() ์‹œ์Šคํ…œ ์ฝœ์€ ๋‘ ๊ฐœ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ(์ฝ๊ธฐ์šฉ, ์“ฐ๊ธฐ์šฉ)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ์ฑ„๋„์„ ๋งŒ๋‹จ๋‹ค. A |B ๊ตฌ๋ฌธ์—์„œ, ์…ธ์€ ํŒŒ์ดํ”„๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋‘ ๊ฐœ์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ํŒŒ์ผ, FD ๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํŠนํžˆ๋‚˜, ์—ด๊ณ  ๋‹ซ๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•ด์ง€๋Š”๋ฐ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ž‘ํ•  ๋•Œ, ์ถœ๋ ฅ-์ž…๋ ฅ์˜ ์—ด๋ ค์žˆ๋Š” ๊ฒƒ๋“ค์„ ์ž˜ ๋‹ซ์•„์ฃผ๋Š” ๋กœ์ง์ด ์•„๋‹ˆ๊ฒŒ ๋˜๋ฉด ์ด์ „ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ถœ๋ ฅํ•˜๊ณ  ๋‹ด์•˜์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ ์ข…๋ฃŒ๊ฐ€ ์•ˆ ๋œ ๊ฒƒ, ํ˜น์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ๋“ค์–ด์˜ฌ๊ฒŒ ๋‚จ์•˜๋‹ค๋Š” ์‹์œผ๋กœ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŠน์ง•์„ ์ดํ•ดํ•˜์ง€ ์•Š์œผ๋ฉด ์ฃผ๊ตฌ์žฅ์ฐฝ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์€โ€ฆ ๋”์ฐํ•œ ๊ฒฝํ—˜์ด์—ˆ๋‹ค(โ€ฆ)
    • ํ”„๋กœ์„ธ์Šค A: ์ž์‹ ์˜ ํ‘œ์ค€ ์ถœ๋ ฅ(STDOUT, fd 1)์„ ํŒŒ์ดํ”„์˜ ์“ฐ๊ธฐ์šฉ ๋์— ์—ฐ๊ฒฐ(dup2)ํ•˜๊ณ , A ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. A์˜ ๋ชจ๋“  ๊ฒฐ๊ณผ๋Š” ์ด์ œ ํ™”๋ฉด์ด ์•„๋‹Œ ํŒŒ์ดํ”„๋กœ ํ˜๋Ÿฌ ๋“ค์–ด๊ฐ„๋‹ค.
    • ํ”„๋กœ์„ธ์Šค B: ์ž์‹ ์˜ ํ‘œ์ค€ ์ž…๋ ฅ(STDIN, fd 0)์„ ํŒŒ์ดํ”„์˜ ์ฝ๊ธฐ์šฉ ๋์— ์—ฐ๊ฒฐ(dup2)ํ•˜๊ณ , B ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. B๋Š” ์ด์ œ ํ‚ค๋ณด๋“œ๊ฐ€ ์•„๋‹Œ ํŒŒ์ดํ”„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. ๋ฆฌ๋‹ค์ด๋ ‰์…˜ (<, >, >>, <<) - ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ œ์–ด: ๋ฆฌ๋‹ค์ด๋ ‰์…˜์€ ํ”„๋กœ์„ธ์Šค์˜ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ๋Œ€์ƒ์„ ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ด๋Š” open()์œผ๋กœ ํŒŒ์ผ์„ ์—ด๊ณ , dup2()๋กœ ๊ธฐ์กด์˜ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ(0, 1, 2)๋ฅผ ์ƒˆ๋กœ ์—ด๋ฆฐ ํŒŒ์ผ์˜ ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ ๋ณต์ œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค. *>: ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ์— ๋ฎ์–ด์“ด๋‹ค. *<: ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ช…๋ น์–ด์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. *>>: ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ ๋์— ์ถ”๊ฐ€ํ•œ๋‹ค. *<< (Here Document): ๊ตฌ๋ถ„์ž(delimiter)๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ž„์‹œ ํŒŒ์ผ์— ์ €์žฅํ•œ ํ›„, ํ•ด๋‹น ์ž„์‹œ ํŒŒ์ผ์„ ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.

  4. ๋‚ด์žฅ ํ•จ์ˆ˜ (Built-ins): cd, export, unset, exit์™€ ๊ฐ™์ด ์…ธ ํ”„๋กœ์„ธ์Šค ์ž์ฒด์˜ ์ƒํƒœ(ํ˜„์žฌ ์ž‘์—… ๊ฒฝ๋กœ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ)๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์€ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ๋‚ด์žฅ ํ•จ์ˆ˜๋“ค์€ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์ธ์ด ๋˜๋Š” ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์˜ ์„ค์ •์„ ๊ฑด๋“œ๋ฆฌ๊ฑฐ๋‚˜, ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด cd๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ž์‹์˜ ๊ฒฝ๋กœ๋งŒ ๋ฐ”๋€Œ๊ณ  ์…ธ ์ž์‹ ์€ ๊ทธ๋Œ€๋กœ์ด๊ณ , ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ทธ ๋’ค์— ์˜ค๋Š” ๋ช…๋ น์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” fork ์—†์ด ์…ธ์ด ์ง์ ‘ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. README.md์— ๋ช…์‹œ๋œ echo, cd, pwd, export, unset, env, exit๊ฐ€ ์ด์— ํ•ด๋‹น๋˜๊ณ , ์ด๋“ค์€ ๋…์ž์ ์ธ ๋ฐฉ์‹์œผ๋กœ OS ์™€ ์ฃผ ํ”„๋กœ์„ธ์Šค์— ์ง์ ‘ ์˜ํ–ฅ์„ ์ฃผ๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค.

๐Ÿšฆ 3๋‹จ๊ณ„: ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ - ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ƒํ™ฉ์— ๋Œ€์‘ํ•˜๊ธฐ

์‚ฌ์šฉ์ž๋Š” ์–ธ์ œ๋“ ์ง€ Ctrl+C(SIGINT)๋‚˜ Ctrl+D(EOF)๋ฅผ ๋ˆŒ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋ ค ํ•  ์ˆ˜ ์žˆ๋‹ค.์ƒํ˜ธ์ž‘์šฉ์ ์ธ ์…ธ์€ ์ด๋Ÿฌํ•œ ์‹œ๊ทธ๋„์„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜์—ฌ, ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ์™€ ํ”„๋กฌํ”„ํŠธ์—์„œ ์ž…๋ ฅ์„ ๋Œ€๊ธฐ ์ค‘์ผ ๋•Œ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. signal ๋˜๋Š” sigaction ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํŠน์ • ์‹œ๊ทธ๋„์ด ๋„์ฐฉํ–ˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•  ๋™์ž‘์„ ์ •์˜ํ•˜์—ฌ, ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œ์ผฐ๋‹ค. *๋Œ€๊ธฐ ์ค‘: Ctrl+C๋Š” ์ƒˆ ํ”„๋กฌํ”„ํŠธ๋ฅผ, Ctrl+D๋Š” ์…ธ์„ ์ข…๋ฃŒํ•œ๋‹ค.

  • ์‹คํ–‰ ์ค‘: Ctrl+C์™€ Ctrl+\๋Š” ์‹คํ–‰ ์ค‘์ธ ์ž์‹ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

โœจ ์„ฑ์ฐฐ ๋ฐ ๋ฐฐ์šด ์ 

Minishell์€ ๋‹จ์ˆœํ•œ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณผ์ œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค. ์šด์˜์ฒด์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค๋“ค์„ ์กฐ์œจํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ์ •๋ง ์ข‹์€ ๊ณผ์ œ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•œ ๊ฐœ์ธ์ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๊ณ , ๊ฒฐ๊ตญ ํ˜‘์—…์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ข…ํ•ฉ ์˜ˆ์ˆ ์ž„์„ ์ฒ˜์Œ์œผ๋กœ ๋А๋‚„ ์ˆ˜ ์žˆ๋˜ ๊ณผ์ œ๋‹ค. ๊ทธ ์™€์ค‘์— ๋А๋‚€ ์ ๋“ค ๋ช‡๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด,

  • ์ถ”์ƒํ™”์˜ ์œ„๋Œ€ํ•จ: |๋‚˜ > ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ธฐํ˜ธ ๋’ค์— fork, pipe, dup2, execve์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ ์ฝœ๋“ค์˜ ์˜ค์ผ€์ŠคํŠธ๋ผ๊ฐ€ ์ˆจ์–ด์žˆ์Œ์„ ๊นจ๋‹ฌ์œผ๋ฉฐ, ์ž˜ ์„ค๊ณ„๋œ ์ถ”์ƒํ™”์˜ ํž˜์„ ์ฒด๊ฐํ–ˆ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์˜ ์ •์ˆ˜: ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ๊ด€๊ณ„, ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์ƒ์†, ํ”„๋กœ์„ธ์Šค์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ฉฐ ์šด์˜์ฒด์ œ์˜ ํ•ต์‹ฌ ์—ญํ• ์ธ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ํ”ผ๋ถ€๋กœ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ: ์–ดํœ˜ ๋ถ„์„๊ธฐ, ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ, ์‹คํ–‰๊ธฐ๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ๋œ ๋ชจ๋“ˆ๋กœ ์„ค๊ณ„ํ•˜๊ณ , ์ด๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ช…ํ™•ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ(AST)๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณผ์ •์€, ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ฒฌ๊ณ ํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๊ฐ€ ์„ ํ–‰๋˜์–ด์•ผ ํ•จ์„ ๊ฐ€๋ฅด์ณ์ฃผ์—ˆ๋‹ค.

์ •๋ง ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ํฌ๊ธฐํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ์ •๋ง ๋งŽ์ด ํ–ˆ๊ณ , ๋ฌด์—‡๋ณด๋‹ค ํŒ€์›๊ณผ ํ•จ๊ป˜ ๊ธฐ์šด์ด ๋น ์ง€๋Š” ์ •๋ง ์‰ฝ์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ์˜€๋‹ค. ๊ทธ๋ž˜๋„ ์—ญ์‹œ ๊ทธ๋Ÿฐ ๊ฑธ๊นŒ? ๋Œ์•„๋ณด๋‹ˆ ์ •๋ง ์žฌ๋ฐŒ๊ณ , ์น˜์—ดํ–ˆ๋˜๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿคฃ