System_programming

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)) ...

<span title='2023-07-15 08:35:21 +0900 KST'>July 15, 2023</span>&nbsp;ยท&nbsp;10 min&nbsp;ยท&nbsp;AswinBlue