๊ฐ๋ฐ์๊ฐ Unix tree ๋ช ๋ น์ด๋ฅผ C๋ก ์ฌ๊ตฌํํ๋ฉด์ opendir()/readdir(), stat(), ์ฌ๊ท ํจ์, qsort()๋ฅผ ํตํ ์ค๋ฌด CLI ๋๊ตฌ ์ค๊ณ ๋ฐฉ์ ์ต๋
๐ณ Building `ctree`: A Lightweight Unix `tree` Clone in C
AI ์์ฝ
Context
Unix tree์ ๊ฐ์ ์ค์ CLI ๋๊ตฌ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ธฐ ์ํด์๋ ์ด๋ก ๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ฉฐ, ํ์ผ์์คํ ์ํ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ์ธ์ ํ์ฑ ๋ฑ ๋ฎ์ ์์ค์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ ํตํฉ์ ์ผ๋ก ํ์ตํ ํ์๊ฐ ์์๋ค.
Technical Solution
- opendir()์ readdir()๋ฅผ ์ฌ์ฉํ ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ ์ฝ๊ธฐ: ๋จ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ชจ๋ ํญ๋ชฉ์ ๋ฐฐ์ด์ ์ ์ฅ
- stat() ํจ์๋ก ํ์ผ/๋๋ ํฐ๋ฆฌ ๊ตฌ๋ถ: ๊ฐ ์ํธ๋ฆฌ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ํํฐ๋ง ๊ฐ๋ฅํ๊ฒ ๊ตฌํ
- qsort()๋ฅผ ํตํ ์ํ๋ฒณ ์ ๋ ฌ: ๋ฐฐ์ด์ ์์ง๋ ์ํธ๋ฆฌ๋ค์ ์ ๋ ฌํ์ฌ ๊น๋ํ ์ถ๋ ฅ ๋ณด์ฅ
- ์ฌ๊ท์ ๋๋ ํฐ๋ฆฌ ์ํ ํ์ดํ๋ผ์ธ: ์ํธ๋ฆฌ ์์ง โ ํํฐ๋ง โ ์ถ๋ ฅ ๋ฐ ์ธ๋ฑ์ฑ โ ์ฌ๊ท ์ฒ๋ฆฌ ์์๋ก ๊ตฌํ
- ์ ํ์ ํํฐ๋ง ์ต์ ๊ตฌํ: -d ํ๋๊ทธ๋ก ๋๋ ํฐ๋ฆฌ๋ง ํ์, -L ํ๋๊ทธ๋ก ์ฌ๊ท ๊น์ด ์ ํ, ํ์ผ ํฌ๊ธฐ ๋ฐ์ดํธ ๋จ์ ํ์
- ๋ชจ๋์ C ํ๋ก์ ํธ ๊ตฌ์กฐ: Tree.h(์ ์ธ), Tree.c(ํต์ฌ ๋ก์ง), main.c(CLI ํ์ฑ)๋ก ๋ถ๋ฆฌ
Key Takeaway
C์์ ์ค์ CLI ๋๊ตฌ๋ฅผ ๊ตฌํํ ๋ POSIX API(opendir, readdir, stat), ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(strdup, free), ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด ์ ๋ ฌ ํ ํํฐ๋งํ๋ ์์ ์กฐ์ ์ด ์ถ๋ ฅ ์ ํ์ฑ์ ์ง์ ์ํฅ์ ๋ฏธ์น๋ฉฐ, ์์ ํ๋ก์ ํธ์ผ์ง๋ผ๋ ์ด๋ฌํ ์ ์์ค ๊ฐ๋ ๋ค์ ํตํฉ์ ์ผ๋ก ๊ฒฝํํ๋ ๊ฒ์ด ์์คํ ๋๊ตฌ์ ์ค๊ณ ์๋ฆฌ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ์ดํดํ๊ฒ ํ๋ค.
์ค์ฒ ํฌ์ธํธ
C๋ก CLI ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๋ ์์ง๋์ด๋ readdir() ๋ฃจํ์์ ๋ชจ๋ ์ํธ๋ฆฌ๋ฅผ ๋จผ์ ๋ฐฐ์ด์ ์์งํ ํ qsort()๋ก ์ ๋ ฌํ๊ณ , ๊ทธ ๋ค์์ -d ๊ฐ์ ํํฐ๋ฅผ ์ ์ฉํ๋ฉฐ, ๋ง์ง๋ง์ ์ธ๋ฑ์ฑ์ ๊ณ์ฐํ๋ 3๋จ๊ณ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ฉด tree ๋ช ๋ น์ด์ฒ๋ผ ์ ํํ ํธ๋ฆฌ ํ์ ์ถ๋ ฅ์ ์ป์ ์ ์๋ค.