System Programming ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ ๊ตฌ์กฐ๋ ํฌ๊ฒ application, kernel, HW ๋ก ๋ถ๋ฆฌํ ์ ์๋ค. _____________
| Library |
ยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏ Application level
------------------------------
_____________
|System call|
ยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏ Kernel level
------------------------------
_____________
| Hardware |
ยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏ H/W level
------------------------------ application level์์๋ library๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ด ์ฝ๋๋ค์ library buffer๋ฅผ ์ฌ์ฉํ๋ค. (open(), read(), write(), close() โฆ) ์์คํ
์์ ์ ๊ณตํ๋ ์ต์ ์ buffer ๋จ์๋ก disk์์ ๊ฐ์ ์ฝ์ด์ค๊ณ , library buffer์ ๋ด์๋๋ฉด ์์๋จ์๋ก ์ฝ์ด์ฌ ๋ ํจ์จ์ ์ด๋ค. ์๋ฅผ๋ค์ด, ํ ์ค์ฉ ํ์ผ์ ์ฝ์ด์ผ ํ๋ค๋ฉด, 1byte์ฉ ํ์ผ์์ โ\nโ์ ๊ฐ์งํ ๋ ๊น์ง ์ฝ์ ์ ์์ง๋ง, BUF_SIZ๋งํผ ํ์ผ์์ ์ฝ์ด์ library buffer์ ๋ด์๋๊ณ library buffer๋ฅผ 1byte์ฉ ์ฝ์ผ๋ฉฐ โ\nโ๋ฅผ ์ฐพ๋ ๊ฒ์ด ์คํ ์๋๋ ๋ ๋น ๋ฅด๋ค. (IO์ ๊ทผ์ ์ ์์๋ก ํจ์จ์ ) Kernel level์์๋ System call์ ์ฌ์ฉํ๋ฉฐ system buffer๋ฅผ ์ฌ์ฉํ๋ค. application level ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ณดํต library buffer๋ฅผ 1์ฐจ์ ์ผ๋ก ์ฌ์ฉํ๊ณ , ๋ด๋ถ์ ์ผ๋ก system call์ ์ํํด system buffer๋ฅผ 2์ฐจ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค. printf๋ c library ํจ์์ด๋ฉฐ, โ\nโ์ ๋ง๋์ผ ํ๋ฉด์์ ์ถ๋ ฅ์ ํ๋ค. โ\nโ์ด ์
๋ ฅ๋๊ธฐ ์ ๊น์ง ๋ฌธ์์ด๋ค์ library buffer์ ๊ธฐ๋ก๋๋ค. fprintf๋ โ\nโ๊ณผ ์๊ด์์ด ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค. ์ฆ library buffer๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ํ์ผ ์
์ถ๋ ฅ fgetc C์์ ํ์ผ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ fopen ํจ์๋ฅผ ์ฌ์ฉํ๋ค. fopen์ ํ์ผ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ฉฐ, ์ฝ๋ ๋ด์์ ํ์ผ ํฌ์ธํฐ๋ก ํด๋น ํ์ผ์ ์ ๊ทผ์ด๊ฐ๋ฅํ๋ค. fgetc(FPTR) ํจ์๋ fopen์ผ๋ก ์ฐ ํ์ผ ํฌ์ธํฐ๋ฅผ ์ฐธ์กฐํด์ char ํ๋๋ฅผ ์ฝ๊ณ ๋ฐํํ๋ค. fgetc ํจ์์ ๋ฐํ ๊ฐ์ int ํํ์ด๋ค. text file์ ์ฝ์ ๋, 0xFF๊ฐ์ด ๋ด์ฉ์ ์ฌ ์ ์์ง๋ง, binary file์ ์ฝ์ ๋ ์ค๊ฐ์ 0xFF ๊ฐ์ด ์ฌ ์ ์๋ค. char ํํ๋ก 0xFF๋ฅผ ์ฝ์ผ๋ฉด -1๊ฐ์ ํด๋นํ๊ธฐ ๋๋ฌธ์, EOF์ ๊ตฌ๋ถ์ด ๋ถ๊ฐ๋ฅํ์ฌ char ๋์ int๋ฅผ ๋ฐํํ๋๋ก ๋์ด์๋ค. ํ์ผ ๊ตฌ์กฐ์ฒด fopen์ ํ์ผ ๊ตฌ์กฐ์ฒด์ ์ฃผ์(ํฌ์ธํฐ)๋ฅผ ๋ฐํํ๋ค. ํ์ผ ๊ตฌ์กฐ์ฒด๋ ์๋์ ๊ฐ์ ๋ด์ฉ์ ๋ด๊ณ ์๋ค. _flags: _IO_read_ptr : ๋ค์ ๋ช
๋ น์ ํ์ผ์ ์ฝ๊ฑฐ๋ ์ธ ์์น _IO_read_end: kernel์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ ์ฅํ ๋ฒํผ์ ๋ ์์น. _IO_read_base: kernel์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ ์ฅํ ๋ฒํผ์ ์์ ์์น. ํ์ผ์ ๋ํ ์ฝ๊ธฐ ๋ช
๋ น(fgetc/fgets๋ฑ) ์ด ๋ฐ์ํ์ ๋, kernel์ 4096byte(BUF_SIZE) ๋งํผ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์ด์ ์ด๊ณณ์ ์ฑ์๋๋ค. _fileno: ํ์ผ์ offset, kernel์์ ํด๋น ํ์ผ์ ์ ํด์ค index(kernel ํจ์์์ ์ฌ์ฉํ ์ ์๋ค.) fopen ์์ ํ์ผ ๊ตฌ์กฐ์ฒด๊ฐ ์์ฑ ๋ฐ ์ด๊ธฐํ ๋์ง๋ง, IO_read* ์ธ์๋ค์ ํ์ผ ์ ๊ทผ์ด ์ด๋ฃจ์ด์ง๊ณผ ๋์์ ๊ฐ์ด ์ ์ฉ๋๋ค. EOF ํ์ผ์ ๋๊น์ง ์ฝ์๋ค๊ณ ํ๋จํ๋ ๊ฒ์, EOF ๋ฌธ์(-1) ์ผ๋ก ํ๋จํ๋ค. ํ์ง๋ง ์ค์ ํ์ผ์ ์ฝ์ด๋ณด๋ฉด ๋ง์ง๋ง์ -1๊ฐ์ด ์ค์ ๋ก ๋ค์ด์์ง๋ ์๋ค. EOF ๊ฐ์ file I/O ํจ์์ ๋ฆฌํด๊ฐ์ผ ๋ฟ ์ค์ ํ์ผ์ ๊ธฐ์
๋ ๊ฐ์ด ์๋๋ค. file I/O ํจ์๋ i-node์ ๊ธฐ๋ก๋ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ ๋์ ํ๋จํ๋ค. ASKII ์ฝ๋ ์ค ์ฃผ์ ๋ฌธ์์ ๊ฐ ์ฐธ์กฐ a: 97 A: 68 0: 48 \n: 10 \r: 13 (๊ณต๋ฐฑ): 32 \t: 9 \0: 0 fguts(BUFF, SIZE, FPTR) ํจ์๋ fopen์ผ๋ก ์ฐ ํ์ผ ํฌ์ธํฐ๋ฅผ ์ฐธ์กฐํด์ line ํ๋๋ฅผ ์ฝ์ด์จ๋ค. fputs(BUFF, FPTR) ํจ์๋ fopen์ผ๋ก ์ฐ ํ์ผ ํฌ์ธํฐ๋ฅผ ์ฐธ์กฐํด์ line ํ๋๋ฅผ ์ถ๋ ฅํ๋ค. ๋ฆฌ๋
์ค์์ ํ์ค ์
๋ ฅ/์ถ๋ ฅ/์๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ผ ํฌ์ธํฐ๋ฅผ ์ด์ด๋๋ค. ๊ฐ๊ฐ ์๋ ๋ฌธ์์ด ํน์ ๋ฒํธ๋ก ์ฐธ์กฐ ๊ฐ๋ฅํ๋ค. stdin : ํ์ค ์
๋ ฅ stdout : ํ์ค ์ถ๋ ฅ stderr: ํ์ค ์๋ฌ -> ํ์ผ ํฌ์ธํฐ ๋์ stdout ์ ์
๋ ฅํ๋ฉด ํ์ค ์ถ๋ ฅ์ผ๋ก ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค. (ex: fputc(BUF, stdout))
...