๐Ÿ–ฅ๏ธ ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์„ธ๊ณ„๋กœ ๋– ๋‚˜๋Š” ๋ชจํ—˜! ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ–ฅ๏ธ ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์„ธ๊ณ„๋กœ ๋– ๋‚˜๋Š” ๋ชจํ—˜! ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํƒํ—˜๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” C ์–ธ์–ด์˜ ์‹ฌ์žฅ๋ถ€๋กœ ๋“ค์–ด๊ฐ€๋Š” ํฅ๋ฏธ์ง„์ง„ํ•œ ์—ฌํ–‰์„ ๋– ๋‚˜๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์ง€๋Š” ๋ฐ”๋กœ '์‹œ์Šคํ…œ ์ฝœ'๊ณผ '์ €์ˆ˜์ค€ ํŒŒ์ผ I/O'๋ผ๋Š” ์‹ ๋น„๋กœ์šด ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ด ์—ฌํ–‰์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ์ปดํ“จํ„ฐ์˜ ๊นŠ์€ ๊ณณ์—์„œ ์ผ์–ด๋‚˜๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์ผ๋“ค์„ ์ดํ•ดํ•˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜‰

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์ด๋ผ๋Š” ์žฌ๋Šฅ ๊ณต์œ  ํ”Œ๋žซํผ์„ ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ์ด๊ณณ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šธ ๋‚ด์šฉ๋„ ์žฌ๋Šฅ๋„ท์˜ '์ง€์‹์ธ์˜ ์ˆฒ' ๋ฉ”๋‰ด์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ๋ชจํ—˜์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐ŸŒŸ

๐Ÿ” ์‹œ์Šคํ…œ ์ฝœ: ์šด์˜์ฒด์ œ์™€์˜ ๋Œ€ํ™”

๋จผ์ €, '์‹œ์Šคํ…œ ์ฝœ'์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ์‹œ์Šคํ…œ ์ฝœ์€ ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์šด์˜์ฒด์ œ์™€ ๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์Œ์‹์ ์—์„œ ์›จ์ดํ„ฐ์—๊ฒŒ ์ฃผ๋ฌธ์„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์šด์˜์ฒด์ œ์—๊ฒŒ ํŠน๋ณ„ํ•œ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฝ๏ธ ์‹œ์Šคํ…œ ์ฝœ ๋น„์œ : ๋ ˆ์Šคํ† ๋ž‘ ์ฃผ๋ฌธ

์—ฌ๋Ÿฌ๋ถ„์ด ๋ ˆ์Šคํ† ๋ž‘์— ๊ฐ”๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ๋ฉ”๋‰ด๋ฅผ ๋ณด๊ณ  ์Œ์‹์„ ๊ณ ๋ฅด์ง€๋งŒ, ์ง์ ‘ ์ฃผ๋ฐฉ์— ๊ฐ€์„œ ์š”๋ฆฌํ•˜์ง€๋Š” ์•Š์ฃ ? ๋Œ€์‹  ์›จ์ดํ„ฐ์—๊ฒŒ ์ฃผ๋ฌธ์„ ํ•ฉ๋‹ˆ๋‹ค. ์›จ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฃผ๋ฌธ์„ ์ฃผ๋ฐฉ์— ์ „๋‹ฌํ•˜๊ณ , ์Œ์‹์ด ์ค€๋น„๋˜๋ฉด ๊ฐ€์ ธ๋‹ค์ค๋‹ˆ๋‹ค.

์ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ”„๋กœ๊ทธ๋žจ์€ ์ง์ ‘ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์šด์˜์ฒด์ œ์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ๋Š” ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ”„๋กœ๊ทธ๋žจ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ์ฝœ์€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ์–ด์š”. ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ ๋‹ซ๋Š” ๊ฒƒ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•˜๋Š” ๊ฒƒ ๋“ฑ ๋ชจ๋‘ ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•  ๊ฒƒ์€ ํŒŒ์ผ ๊ด€๋ จ ์‹œ์Šคํ…œ ์ฝœ์ด์—์š”.

๐Ÿ“ ํŒŒ์ผ ๊ด€๋ จ ์ฃผ์š” ์‹œ์Šคํ…œ ์ฝœ

  • open(): ํŒŒ์ผ์„ ์—ด์–ด์š”. ๋งˆ์น˜ ์ฑ…์„ ํŽด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ .
  • read(): ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์š”. ์ฑ…์˜ ๋‚ด์šฉ์„ ์ฝ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”.
  • write(): ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์จ์š”. ์ฑ…์— ๋ฉ”๋ชจ๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”.
  • close(): ํŒŒ์ผ์„ ๋‹ซ์•„์š”. ๋‹ค ์ฝ์€ ์ฑ…์„ ๋ฎ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ .

์ด ์‹œ์Šคํ…œ ์ฝœ๋“ค์€ C ์–ธ์–ด์—์„œ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ํ•จ์ˆ˜๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ์šด์˜์ฒด์ œ์™€ ์ง์ ‘ ๋Œ€ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— '์ €์ˆ˜์ค€'์ด๋ผ๊ณ  ๋ถˆ๋ ค์š”. ๋งˆ์น˜ ํ†ต์—ญ์‚ฌ ์—†์ด ์™ธ๊ตญ์ธ๊ณผ ์ง์ ‘ ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

์‹œ์Šคํ…œ ์ฝœ ๊ณผ์ • ๋„์‹ํ™” ํ”„๋กœ๊ทธ๋žจ ์šด์˜์ฒด์ œ ์‹œ์Šคํ…œ ์ฝœ ์š”์ฒญ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

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

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ํ–ˆ์–ด์š”. ๋‹ค์Œ์œผ๋กœ, ์ด ์‹œ์Šคํ…œ ์ฝœ์„ ์ด์šฉํ•ด ์‹ค์ œ๋กœ ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ• ๊นŒ์š”? ๐Ÿš€

๐Ÿ“‚ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O: ํŒŒ์ผ๊ณผ์˜ ์ง์ ‘ ๋Œ€ํ™”

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋Š” ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ํŒŒ์ผ๊ณผ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ณ ์ˆ˜์ค€ I/O ํ•จ์ˆ˜๋“ค(์˜ˆ: fopen(), fclose(), fprintf(), fscanf() ๋“ฑ)๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์ €์ˆ˜์ค€ I/O ํ•จ์ˆ˜๋“ค์€ ์šด์˜์ฒด์ œ์™€ ๋” ๊ฐ€๊น๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งˆ์น˜ ํ†ต์—ญ์‚ฌ ์—†์ด ์™ธ๊ตญ์ธ๊ณผ ์ง์ ‘ ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ . ์–ด๋ ต์ง€๋งŒ, ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์–ด์š”!

๐Ÿ—๏ธ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ํŠน์ง•

  • ์šด์˜์ฒด์ œ์™€ ์ง์ ‘ ํ†ต์‹ 
  • ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์‚ฌ์šฉ
  • ๋ฒ„ํผ๋ง์ด ์—†์Œ (์ง์ ‘ ์ œ์–ด ๊ฐ€๋Šฅ)
  • ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด ๊ฐ€๋Šฅ
  • ํ”Œ๋žซํผ ์˜์กด์ ์ผ ์ˆ˜ ์žˆ์Œ

์ž, ์ด์ œ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์ฃผ์š” ํ•จ์ˆ˜๋“ค์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ์š”? ์ด ํ•จ์ˆ˜๋“ค์€ ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ํŒŒ์ผ์ด๋ผ๋Š” ๋ณด๋ฌผ์ƒ์ž๋ฅผ ๋‹ค๋ฃจ๋Š” ์—ด์‡ ์™€ ๊ฐ™์•„์š”! ๐Ÿ—๏ธ

1. open() ํ•จ์ˆ˜: ํŒŒ์ผ ์—ด๊ธฐ ๐Ÿšช

int open(const char *pathname, int flags, mode_t mode);

open() ํ•จ์ˆ˜๋Š” ํŒŒ์ผ์„ ์—ฌ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋ฌธ์„ ์—ด๊ณ  ๋ฐฉ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

  • pathname: ์—ด๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • flags: ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์—ด ๊ฒƒ์ธ์ง€ ์ง€์ • (์ฝ๊ธฐ ์ „์šฉ, ์“ฐ๊ธฐ ์ „์šฉ, ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋“ฑ)
  • mode: ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ถŒํ•œ ์„ค์ •

open() ํ•จ์ˆ˜๋Š” ์„ฑ๊ณตํ•˜๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ผ๋Š” ์ •์ˆ˜๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์•ž์œผ๋กœ ์ด ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” '์†์žก์ด' ์—ญํ• ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ๋น„์œ : ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ๋งˆ์น˜ ๋„์„œ๊ด€์˜ ์ฑ… ๋Œ€์ถœ ์นด๋“œ์™€ ๊ฐ™์•„์š”. ์ฑ…์„ ๋นŒ๋ฆด ๋•Œ ๋ฐ›๋Š” ์นด๋“œ์ฒ˜๋Ÿผ, ํŒŒ์ผ์„ ์—ด ๋•Œ ๋ฐ›๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๋ฐ”๋กœ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒˆํ˜ธ๋กœ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ํŒŒ์ผ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์ฃ !

2. read() ํ•จ์ˆ˜: ํŒŒ์ผ ์ฝ๊ธฐ ๐Ÿ“–

ssize_t read(int fd, void *buf, size_t count);

read() ํ•จ์ˆ˜๋Š” ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ฑ…์˜ ๋‚ด์šฉ์„ ์ฝ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!

  • fd: ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ (open()์œผ๋กœ ์–ป์€ ๊ฐ’)
  • buf: ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฒ„ํผ
  • count: ์ฝ๊ณ ์ž ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ˆ˜

read() ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์ฝ์€ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด 0์„, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ด์š”.

3. write() ํ•จ์ˆ˜: ํŒŒ์ผ ์“ฐ๊ธฐ โœ๏ธ

ssize_t write(int fd, const void *buf, size_t count);

write() ํ•จ์ˆ˜๋Š” ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค. ์ฑ…์— ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ์ ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

  • fd: ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ
  • buf: ์“ฐ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ฒ„ํผ
  • count: ์“ฐ๊ณ ์ž ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ˆ˜

write() ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์“ด ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ด์š”.

4. close() ํ•จ์ˆ˜: ํŒŒ์ผ ๋‹ซ๊ธฐ ๐Ÿšช

int close(int fd);

close() ํ•จ์ˆ˜๋Š” ์—ด๋ฆฐ ํŒŒ์ผ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ๋‹ค ์ฝ์€ ์ฑ…์„ ๋ฎ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!

  • fd: ๋‹ซ๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

close() ํ•จ์ˆ˜๋Š” ์„ฑ๊ณตํ•˜๋ฉด 0์„, ์‹คํŒจํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋„ค ๊ฐ€์ง€ ํ•จ์ˆ˜๊ฐ€ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ํ•ต์‹ฌ์ด์—์š”. ์ด๋“ค์„ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ํŒŒ์ผ์„ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Š

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ๊ณผ์ • ๋„์‹ํ™” ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ๊ณผ์ • open() read() write() close() ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ๋ฆ„

์ด ๊ทธ๋ฆผ์€ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. open()์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ, read()์™€ write()๋กœ ํŒŒ์ผ์„ ์กฐ์ž‘ํ•˜๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ close()๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋“ค์„ ์•Œ์•„๋ดค์–ด์š”. ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ด์š”. ์ด ํ•จ์ˆ˜๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ๋ฌด์—‡์ธ์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ์–ด์š”. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋“ค์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ์™€ ํ•จ๊ป˜, ๋” ๊นŠ์ด ์žˆ๋Š” ๋‚ด์šฉ์„ ๋‹ค๋ค„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ์šฐ๋ฆฌ์˜ ๋ชจํ—˜์€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค! ๐Ÿš€

๐Ÿ”ฌ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ์‹ค์ „ ํ™œ์šฉ

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋“ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ด ํ•จ์ˆ˜๋“ค์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์ง€ ์•Š๋‚˜์š”? ์ž, ์ด์ œ ์‹ค์ „ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ด ํ•จ์ˆ˜๋“ค์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ๋ฅผ ๋”ฐ๋ผ ํ•˜๋“ฏ์ด, ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณผ ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ

๐Ÿ“ ์˜ˆ์ œ 1: ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์“ฐ๊ธฐ

๋จผ์ €, ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”?


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
    int fd;
    char *text = "์•ˆ๋…•ํ•˜์„ธ์š”, ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์„ธ๊ณ„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!\n";
    
    // ํŒŒ์ผ ์—ด๊ธฐ (์—†์œผ๋ฉด ์ƒ์„ฑ)
    fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }
    
    // ํŒŒ์ผ์— ์“ฐ๊ธฐ
    ssize_t bytes_written = write(fd, text, strlen(text));
    if (bytes_written == -1) {
        perror("ํŒŒ์ผ ์“ฐ๊ธฐ ์‹คํŒจ");
        close(fd);
        return 1;
    }
    
    printf("%zd ๋ฐ”์ดํŠธ๋ฅผ ํŒŒ์ผ์— ์ผ์Šต๋‹ˆ๋‹ค.\n", bytes_written);
    
    // ํŒŒ์ผ ๋‹ซ๊ธฐ
    if (close(fd) == -1) {
        perror("ํŒŒ์ผ ๋‹ซ๊ธฐ ์‹คํŒจ");
        return 1;
    }
    
    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค:

  1. open() ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. O_WRONLY (์“ฐ๊ธฐ ์ „์šฉ), O_CREAT (ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒ์„ฑ), O_TRUNC (๊ธฐ์กด ๋‚ด์šฉ ์‚ญ์ œ) ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์š”.
  2. write() ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค.
  3. close() ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์ฃผ์˜์‚ฌํ•ญ

๊ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ์˜ค๋ฅ˜๋ฅผ ์ฒดํฌํ•ด์•ผ ํ•ด์š”. ํŒŒ์ผ ์ž‘์—…์€ ์–ธ์ œ๋‚˜ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋งˆ์น˜ ์š”๋ฆฌํ•  ๋•Œ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๋ง›์„ ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!

๐Ÿ“– ์˜ˆ์ œ 2: ํŒŒ์ผ ์ฝ๊ธฐ

์ด๋ฒˆ์—๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด์˜ค๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”?


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

#define BUFFER_SIZE 1024

int main() {
    int fd;
    char buffer[BUFFER_SIZE];
    ssize_t bytes_read;
    
    // ํŒŒ์ผ ์—ด๊ธฐ
    fd = open("example.txt", O_RDONLY);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }
    
    // ํŒŒ์ผ ์ฝ๊ธฐ
    while ((bytes_read = read(fd, buffer, BUFFER_SIZE)) > 0) {
        write(STDOUT_FILENO, buffer, bytes_read);
    }
    
    if (bytes_read == -1) {
        perror("ํŒŒ์ผ ์ฝ๊ธฐ ์‹คํŒจ");
        close(fd);
        return 1;
    }
    
    // ํŒŒ์ผ ๋‹ซ๊ธฐ
    if (close(fd) == -1) {
        perror("ํŒŒ์ผ ๋‹ซ๊ธฐ ์‹คํŒจ");
        return 1;
    }
    
    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š”:

  1. open() ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์„ ์ฝ๊ธฐ ๋ชจ๋“œ๋กœ ์—ฝ๋‹ˆ๋‹ค.
  2. read() ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” while ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ ์ „์ฒด๋ฅผ ์ฝ์–ด์š”.
  3. ์ฝ์€ ๋‚ด์šฉ์„ ํ‘œ์ค€ ์ถœ๋ ฅ(ํ™”๋ฉด)์— ์”๋‹ˆ๋‹ค.
  4. ๋งˆ์ง€๋ง‰์œผ๋กœ close() ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๋ฒ„ํผ ์‚ฌ์šฉ์˜ ์ค‘์š”์„ฑ

์ด ์˜ˆ์ œ์—์„œ๋Š” BUFFER_SIZE๋ผ๋Š” ํฌ๊ธฐ์˜ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์š”. ์ด๋Š” ํŒŒ์ผ์„ ํ•œ ๋ฒˆ์— ์กฐ๊ธˆ์”ฉ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ํฐ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ ํŠนํžˆ ์ค‘์š”ํ•ด์š”. ๋งˆ์น˜ ํฐ ๋ฌผํ†ต์˜ ๋ฌผ์„ ์ž‘์€ ์ปต์œผ๋กœ ์กฐ๊ธˆ์”ฉ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

๐Ÿ”„ ์˜ˆ์ œ 3: ํŒŒ์ผ ๋ณต์‚ฌ

์ด์ œ ์•ž์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•ด์„œ, ํ•œ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

#define BUFFER_SIZE 4096

int main(int argc, char *argv[]) {
    int fd_src, fd_dest;
    char buffer[BUFFER_SIZE];
    ssize_t bytes_read, bytes_written;
    
    if (argc != 3) {
        fprintf(stderr, "์‚ฌ์šฉ๋ฒ•: %s <์›๋ณธ ํŒŒ์ผ> <๋Œ€์ƒ ํŒŒ์ผ>\n", argv[0]);
        return 1;
    }
    
    // ์›๋ณธ ํŒŒ์ผ ์—ด๊ธฐ
    fd_src = open(argv[1], O_RDONLY);
    if (fd_src == -1) {
        perror("์›๋ณธ ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }
    
    // ๋Œ€์ƒ ํŒŒ์ผ ์—ด๊ธฐ (์—†์œผ๋ฉด ์ƒ์„ฑ)
    fd_dest = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd_dest == -1) {
        perror("๋Œ€์ƒ ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        close(fd_src);
        return 1;
    }
    
    // ํŒŒ์ผ ๋ณต์‚ฌ
    while ((bytes_read = read(fd_src, buffer, BUFFER_SIZE)) > 0) {
        bytes_written = write(fd_dest, buffer, bytes_read);
        if (bytes_written != bytes_read) {
            perror("ํŒŒ์ผ ์“ฐ๊ธฐ ์‹คํŒจ");
            close(fd_src);
            close(fd_dest);
            return 1;
        }
    }
    
    if (bytes_read == -1) {
        perror("ํŒŒ์ผ ์ฝ๊ธฐ ์‹คํŒจ");
        close(fd_src);
        close(fd_dest);
        return 1;
    }
    
    // ํŒŒ์ผ ๋‹ซ๊ธฐ
    close(fd_src);
    close(fd_dest);
    
    printf("ํŒŒ์ผ ๋ณต์‚ฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n");
    return 0;
}
  

์ด ์˜ˆ์ œ๋Š” ์•ž์„œ ๋ฐฐ์šด ๋ชจ๋“  ๊ฒƒ์„ ์ข…ํ•ฉํ–ˆ์–ด์š”:

  1. ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ฝ๊ธฐ์šฉ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์“ฐ๊ธฐ์šฉ์ด์—์š”.
  2. ์›๋ณธ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ๋ฒ„ํผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ๋Œ€์ƒ ํŒŒ์ผ์— ์”๋‹ˆ๋‹ค.
  4. ์ด ๊ณผ์ •์„ ํŒŒ์ผ์˜ ๋์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  5. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‘ ํŒŒ์ผ์„ ๋ชจ๋‘ ๋‹ซ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ์ค‘์š”์„ฑ

์ด ์˜ˆ์ œ์—์„œ๋Š” ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์—๋Ÿฌ๋ฅผ ์ฒดํฌํ•˜๊ณ  ์žˆ์–ด์š”. ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด๋Ÿฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ž‘์—… ์ค‘ ์–ธ์ œ๋“  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋งˆ์น˜ ์š”๋ฆฌํ•  ๋•Œ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๋ง›์„ ๋ณด๊ณ  ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!

์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋Š” ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์› ์–ด์š”. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ์ „๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค! ์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ๋“ค์„ ๋งŒ๋‚˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๋„ค, ๊ณ„์†ํ•ด์„œ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ๊ณ ๊ธ‰ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ๊ธฐ๋ฒ•

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์ธ ํŒŒ์ผ ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ๋ณต์‚ฌ ์ž‘์—…์„ ์‚ดํŽด๋ดค์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋” ๋ณต์žกํ•˜๊ณ  ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ช‡ ๊ฐ€์ง€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์„ ์•Œ์•„๋ณผ๊นŒ์š”?

1. ํŒŒ์ผ ํฌ์ธํ„ฐ ์ด๋™: lseek() ํ•จ์ˆ˜ ๐Ÿš€

off_t lseek(int fd, off_t offset, int whence);

lseek() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ ๋‚ด์—์„œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์œ„์น˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ฑ…์—์„œ ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }

    // ํŒŒ์ผ์˜ ๋์œผ๋กœ ์ด๋™
    off_t end_pos = lseek(fd, 0, SEEK_END);
    printf("ํŒŒ์ผ ํฌ๊ธฐ: %ld ๋ฐ”์ดํŠธ\n", end_pos);

    // ํŒŒ์ผ์˜ ์‹œ์ž‘์—์„œ 10๋ฐ”์ดํŠธ ์œ„์น˜๋กœ ์ด๋™
    lseek(fd, 10, SEEK_SET);

    char buffer[5];
    read(fd, buffer, 5);
    buffer[5] = '\0';
    printf("10๋ฒˆ์งธ ์œ„์น˜๋ถ€ํ„ฐ 5๋ฐ”์ดํŠธ: %s\n", buffer);

    close(fd);
    return 0;
}
  

๐Ÿ’ก lseek()์˜ ํ™œ์šฉ

lseek()๋Š” ํŒŒ์ผ ํฌ๊ธฐ ํ™•์ธ, ํŠน์ • ์œ„์น˜์—์„œ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ํŒŒ์ผ ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ฑ…์˜ ๋ชฉ์ฐจ๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

2. ํŒŒ์ผ ์ž ๊ธˆ: fcntl() ํ•จ์ˆ˜ ๐Ÿ”’

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ, ํŒŒ์ผ ์ž ๊ธˆ์€ ๋งค์šฐ ์ค‘์š”ํ•ด์š”. fcntl() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ์ž ๊ธ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("shared_file.txt", O_RDWR);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }

    struct flock fl = {
        .l_type = F_WRLCK,  // ์“ฐ๊ธฐ ์ž ๊ธˆ
        .l_whence = SEEK_SET,
        .l_start = 0,
        .l_len = 0,  // 0์€ ํŒŒ์ผ ์ „์ฒด๋ฅผ ์˜๋ฏธ
    };

    printf("ํŒŒ์ผ ์ž ๊ธˆ ์‹œ๋„...\n");
    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("ํŒŒ์ผ ์ž ๊ธˆ ์‹คํŒจ");
        close(fd);
        return 1;
    }

    printf("ํŒŒ์ผ์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค...\n");
    sleep(5);  // ์ž‘์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜

    // ์ž ๊ธˆ ํ•ด์ œ
    fl.l_type = F_UNLCK;
    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("ํŒŒ์ผ ์ž ๊ธˆ ํ•ด์ œ ์‹คํŒจ");
    } else {
        printf("ํŒŒ์ผ ์ž ๊ธˆ์ด ํ•ด์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n");
    }

    close(fd);
    return 0;
}
  

๐Ÿ’ก ํŒŒ์ผ ์ž ๊ธˆ์˜ ์ค‘์š”์„ฑ

ํŒŒ์ผ ์ž ๊ธˆ์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ ค ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์†์ƒ์„ ๋ฐฉ์ง€ํ•ด์š”. ๋งˆ์น˜ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ๊ฐ™์€ ๋…ธํŠธ์— ๊ธ€์„ ์“ฐ๋ ค๊ณ  ํ•  ๋•Œ, ํ•œ ์‚ฌ๋žŒ์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์“ฐ๊ฒŒ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

3. ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ: mmap() ํ•จ์ˆ˜ ๐Ÿ—บ๏ธ

mmap() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ํฐ ํŒŒ์ผ์„ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }

    // ํŒŒ์ผ ํฌ๊ธฐ ํ™•์ธ
    off_t file_size = lseek(fd, 0, SEEK_END);
    lseek(fd, 0, SEEK_SET);  // ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ

    // ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘
    char *file_in_memory = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (file_in_memory == MAP_FAILED) {
        perror("mmap ์‹คํŒจ");
        close(fd);
        return 1;
    }

    // ๋งคํ•‘๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ๋‚ด์šฉ ์ˆ˜์ •
    char *text_to_write = "Hello, Memory-mapped file!";
    memcpy(file_in_memory, text_to_write, strlen(text_to_write));

    // ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋””์Šคํฌ์— ๋™๊ธฐํ™”
    if (msync(file_in_memory, file_size, MS_SYNC) == -1) {
        perror("msync ์‹คํŒจ");
    }

    // ๋งคํ•‘ ํ•ด์ œ
    if (munmap(file_in_memory, file_size) == -1) {
        perror("munmap ์‹คํŒจ");
    }

    close(fd);
    return 0;
}
  

๐Ÿ’ก mmap()์˜ ์žฅ์ 

mmap()์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ I/O ์ž‘์—…์„ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ผ์š”. ํŠนํžˆ ํฐ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ๊ณ  ์“ธ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ฑ…์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋จธ๋ฆฟ์†์— ๋‹ด์•„๋‘๊ณ  ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค์€ ๋” ๋ณต์žกํ•œ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์‹œ์— ๋” ๋งŽ์€ ์ฃผ์˜์™€ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜์ฃ . ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋“ค์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์—ˆ์–ด์š”! ๐Ÿ› ๏ธ

์‹ค์ „ ํŒ๊ณผ ์ฃผ์˜์‚ฌํ•ญ โš ๏ธ

  1. ํ•ญ์ƒ ์—๋Ÿฌ๋ฅผ ์ฒดํฌํ•˜์„ธ์š”. ํŒŒ์ผ ์ž‘์—…์€ ์–ธ์ œ๋“  ์‹คํŒจํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ ์ ˆํžˆ ๊ด€๋ฆฌํ•˜์„ธ์š”. ์‚ฌ์šฉ์ด ๋๋‚œ ํŒŒ์ผ์€ ๋ฐ˜๋“œ์‹œ ๋‹ซ์•„์•ผ ํ•ด์š”.
  3. ํฐ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋ฒ„ํผ ํฌ๊ธฐ์— ์ฃผ์˜ํ•˜์„ธ์š”. ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด ๋น„ํšจ์œจ์ ์ด๊ณ , ๋„ˆ๋ฌด ํฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ํŒŒ์ผ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ๋“œ๋ฝ์— ์ฃผ์˜ํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ์˜ ์ž ๊ธˆ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ฌดํ•œํžˆ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ์–ด์š”.
  5. mmap()์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŒŒ์ผ ํฌ๊ธฐ ๋ณ€๊ฒฝ์— ์ฃผ์˜ํ•˜์„ธ์š”. ๋งคํ•‘๋œ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋Š” ์ ‘๊ทผ์€ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค๊ณผ ์ฃผ์˜์‚ฌํ•ญ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋Š” ๋•Œ๋กœ๋Š” ๋ณต์žกํ•˜๊ณ  ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋งŒํผ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ •๊ตํ•œ ์‹œ๊ณ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ . ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”! ๐Ÿ•ฐ๏ธ

๐ŸŽญ ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์ด๋ฉด

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ํ•˜์ง€๋งŒ ์ด๋“ค์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ์ค‘์š”ํ•œ์ง€ ๋” ๊นŠ์ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด์š”. ๋งˆ์น˜ ๋ฌด๋Œ€ ์œ„์˜ ๊ณต์—ฐ์„ ๋ณด๋Š” ๊ฒƒ์—์„œ ๋‚˜์•„๊ฐ€, ๋ฌด๋Œ€ ๋’ค์˜ ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฑฐ์ฃ !

1. ์ปค๋„๊ณผ์˜ ๋Œ€ํ™” ๐Ÿ“ž

์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค, ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์‹ค ์šด์˜์ฒด์ œ์˜ ์ปค๋„๊ณผ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๊ณ  ์žˆ์–ด์š”. ์ด๋Š” ๋งˆ์น˜ ๋ ˆ์Šคํ† ๋ž‘์—์„œ ์ฃผ๋ฐฉ(์ปค๋„)์— ์ฃผ๋ฌธ์„ ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ .

๐Ÿ’ก ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”?

์‹œ์Šคํ…œ ์ฝœ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์ด ์ž ์‹œ ์ค‘๋‹จ๋˜๊ณ , ์ œ์–ด๊ถŒ์ด ์ปค๋„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ปค๋„์ด ์š”์ฒญ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ๋‹ค์‹œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ œ์–ด๊ถŒ์ด ๋Œ์•„์™€์š”. ์ด ๊ณผ์ •์„ '์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ'์ด๋ผ๊ณ  ํ•ด์š”.

2. ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ โšก

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋Š” ๊ณ ์ˆ˜์ค€ I/O (์˜ˆ: fopen, fread ๋“ฑ)์— ๋น„ํ•ด ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์–ด์š”. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

  • ์ง์ ‘ ์ œ์–ด: ๋ฒ„ํผ๋ง์ด๋‚˜ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ ์—†์ด ์ง์ ‘ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”.
  • ์„ธ๋ฐ€ํ•œ ์ตœ์ ํ™”: ํŠน์ • ์ƒํ™ฉ์— ๋งž์ถฐ ๋” ํšจ์œจ์ ์ธ I/O ์ „๋žต์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ: ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ๋” ์ž˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.

3. ๋ณด์•ˆ๊ณผ ๊ถŒํ•œ ๐Ÿ”

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŒŒ์ผ ๊ถŒํ•œ๊ณผ ๋ณด์•ˆ์— ๋”์šฑ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ด์š”. open() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ •ํ•˜๋Š” ๋ชจ๋“œ์™€ ํ”Œ๋ž˜๊ทธ๋Š” ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


int fd = open("secret.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
  

์ด ์ฝ”๋“œ๋Š” 'secret.txt' ํŒŒ์ผ์„ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด๊ณ , ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œ์œ ์ž์—๊ฒŒ๋งŒ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ฃ .

๐Ÿšจ ์ฃผ์˜์‚ฌํ•ญ

๋ถ€์ ์ ˆํ•œ ํŒŒ์ผ ๊ถŒํ•œ ์„ค์ •์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ํ•ญ์ƒ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ๋งŒ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

4. ์ด์‹์„ฑ๊ณผ ํ‘œ์ค€ํ™” ๐ŸŒ

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ํ•จ์ˆ˜๋“ค์€ POSIX ํ‘œ์ค€์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ UNIX-like ์‹œ์Šคํ…œ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์š”. ํ•˜์ง€๋งŒ Windows์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์šด์˜์ฒด์ œ์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด์‹์„ฑ์„ ๋†’์ด๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šด์˜์ฒด์ œ๋ณ„๋กœ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
  • ์ด์‹์„ฑ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ (์˜ˆ: Apache Portable Runtime)
  • ๊ฐ€๋Šฅํ•œ ํ•œ ํ‘œ์ค€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ ์‚ฌ์šฉ

5. ๋””๋ฒ„๊น…๊ณผ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๐Ÿ”

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ๋•Œ๋กœ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ์™€ ๊ธฐ๋ฒ•์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • strace: ์‹œ์Šคํ…œ ์ฝœ์„ ์ถ”์ ํ•˜์—ฌ ์–ด๋–ค ํ˜ธ์ถœ์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • perror(): ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • valgrind: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.

#include <stdio.h>
#include <errno.h>

if (close(fd) == -1) {
    perror("ํŒŒ์ผ ๋‹ซ๊ธฐ ์‹คํŒจ");
    printf("์—๋Ÿฌ ๋ฒˆํ˜ธ: %d\n", errno);
}
  

์ด๋ ‡๊ฒŒ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ผผ๊ผผํžˆ ํ•˜๋ฉด, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋” ์‰ฝ๊ฒŒ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ฒฐ๋ก : ํž˜์€ ๊ณง ์ฑ…์ž„ ๐Ÿฆธโ€โ™‚๏ธ

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๊ทธ๋งŒํผ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋‹ค๋ค„์•ผ ํ•ด์š”. ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์šด์˜์ฒด์ œ์™€ ๋” ๊ฐ€๊น๊ฒŒ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ณ , ๋” ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์‹œ์— ๋” ๋งŽ์€ ์ฑ…์ž„๊ฐ๋„ ํ•„์š”ํ•˜์ฃ .

์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ๊ฐ•๋ ฅํ•œ ๋งˆ๋ฒ•์„ ๋‹ค๋ฃจ๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ทธ ํž˜์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์ง„์ •ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿง™โ€โ™‚๏ธโœจ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์‚ดํŽด๋ดค์–ด์š”. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์€ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ํ•ญ์ƒ ๊ธฐ์–ตํ•˜์„ธ์š”, ํฐ ํž˜์—๋Š” ํฐ ์ฑ…์ž„์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋“ค์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”!

๐Ÿ”ง ๊ณ ๊ธ‰ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ๊ธฐ๋ฒ•

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์ธ ํŒŒ์ผ ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ๋ณต์‚ฌ ์ž‘์—…์„ ์‚ดํŽด๋ดค์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋” ๋ณต์žกํ•˜๊ณ  ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ช‡ ๊ฐ€์ง€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์„ ์•Œ์•„๋ณผ๊นŒ์š”?

1. ํŒŒ์ผ ํฌ์ธํ„ฐ ์ด๋™: lseek() ํ•จ์ˆ˜ ๐Ÿš€

off_t lseek(int fd, off_t offset, int whence);

lseek() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ ๋‚ด์—์„œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์œ„์น˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ฑ…์—์„œ ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }

    // ํŒŒ์ผ์˜ ๋์œผ๋กœ ์ด๋™
    off_t end_pos = lseek(fd, 0, SEEK_END);
    printf("ํŒŒ์ผ ํฌ๊ธฐ: %ld ๋ฐ”์ดํŠธ\n", end_pos);

    // ํŒŒ์ผ์˜ ์‹œ์ž‘์—์„œ 10๋ฐ”์ดํŠธ ์œ„์น˜๋กœ ์ด๋™
    lseek(fd, 10, SEEK_SET);

    char buffer[5];
    read(fd, buffer, 5);
    buffer[5] = '\0';
    printf("10๋ฒˆ์งธ ์œ„์น˜๋ถ€ํ„ฐ 5๋ฐ”์ดํŠธ: %s\n", buffer);

    close(fd);
    return 0;
}
  

๐Ÿ’ก lseek()์˜ ํ™œ์šฉ

lseek()๋Š” ํŒŒ์ผ ํฌ๊ธฐ ํ™•์ธ, ํŠน์ • ์œ„์น˜์—์„œ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ํŒŒ์ผ ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์ฑ…์˜ ๋ชฉ์ฐจ๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

2. ํŒŒ์ผ ์ž ๊ธˆ: fcntl() ํ•จ์ˆ˜ ๐Ÿ”’

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ, ํŒŒ์ผ ์ž ๊ธˆ์€ ๋งค์šฐ ์ค‘์š”ํ•ด์š”. fcntl() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ์ž ๊ธ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("shared_file.txt", O_RDWR);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }

    struct flock fl = {
        .l_type = F_WRLCK,  // ์“ฐ๊ธฐ ์ž ๊ธˆ
        .l_whence = SEEK_SET,
        .l_start = 0,
        .l_len = 0,  // 0์€ ํŒŒ์ผ ์ „์ฒด๋ฅผ ์˜๋ฏธ
    };

    printf("ํŒŒ์ผ ์ž ๊ธˆ ์‹œ๋„...\n");
    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("ํŒŒ์ผ ์ž ๊ธˆ ์‹คํŒจ");
        close(fd);
        return 1;
    }

    printf("ํŒŒ์ผ์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค...\n");
    sleep(5);  // ์ž‘์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜

    // ์ž ๊ธˆ ํ•ด์ œ
    fl.l_type = F_UNLCK;
    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("ํŒŒ์ผ ์ž ๊ธˆ ํ•ด์ œ ์‹คํŒจ");
    } else {
        printf("ํŒŒ์ผ ์ž ๊ธˆ์ด ํ•ด์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n");
    }

    close(fd);
    return 0;
}
  

๐Ÿ’ก ํŒŒ์ผ ์ž ๊ธˆ์˜ ์ค‘์š”์„ฑ

ํŒŒ์ผ ์ž ๊ธˆ์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ ค ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์†์ƒ์„ ๋ฐฉ์ง€ํ•ด์š”. ๋งˆ์น˜ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ๊ฐ™์€ ๋…ธํŠธ์— ๊ธ€์„ ์“ฐ๋ ค๊ณ  ํ•  ๋•Œ, ํ•œ ์‚ฌ๋žŒ์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์“ฐ๊ฒŒ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

3. ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ: mmap() ํ•จ์ˆ˜ ๐Ÿ—บ๏ธ

mmap() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ํฐ ํŒŒ์ผ์„ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
        return 1;
    }

    // ํŒŒ์ผ ํฌ๊ธฐ ํ™•์ธ
    off_t file_size = lseek(fd, 0, SEEK_END);
    lseek(fd, 0, SEEK_SET);  // ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ

    // ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘
    char *file_in_memory = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (file_in_memory == MAP_FAILED) {
        perror("mmap ์‹คํŒจ");
        close(fd);
        return 1;
    }

    // ๋งคํ•‘๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ๋‚ด์šฉ ์ˆ˜์ •
    char *text_to_write = "Hello, Memory-mapped file!";
    memcpy(file_in_memory, text_to_write, strlen(text_to_write));

    // ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋””์Šคํฌ์— ๋™๊ธฐํ™”
    if (msync(file_in_memory, file_size, MS_SYNC) == -1) {
        perror("msync ์‹คํŒจ");
    }

    // ๋งคํ•‘ ํ•ด์ œ
    if (munmap(file_in_memory, file_size) == -1) {
        perror("munmap ์‹คํŒจ");
    }

    close(fd);
    return 0;
}
  

๐Ÿ’ก mmap()์˜ ์žฅ์ 

mmap()์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ I/O ์ž‘์—…์„ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ผ์š”. ํŠนํžˆ ํฐ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ๊ณ  ์“ธ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ฑ…์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋จธ๋ฆฟ์†์— ๋‹ด์•„๋‘๊ณ  ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค์€ ๋” ๋ณต์žกํ•œ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์‹œ์— ๋” ๋งŽ์€ ์ฃผ์˜์™€ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜์ฃ . ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋“ค์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์—ˆ์–ด์š”! ๐Ÿ› ๏ธ

์‹ค์ „ ํŒ๊ณผ ์ฃผ์˜์‚ฌํ•ญ โš ๏ธ

  1. ํ•ญ์ƒ ์—๋Ÿฌ๋ฅผ ์ฒดํฌํ•˜์„ธ์š”. ํŒŒ์ผ ์ž‘์—…์€ ์–ธ์ œ๋“  ์‹คํŒจํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ ์ ˆํžˆ ๊ด€๋ฆฌํ•˜์„ธ์š”. ์‚ฌ์šฉ์ด ๋๋‚œ ํŒŒ์ผ์€ ๋ฐ˜๋“œ์‹œ ๋‹ซ์•„์•ผ ํ•ด์š”.
  3. ํฐ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋ฒ„ํผ ํฌ๊ธฐ์— ์ฃผ์˜ํ•˜์„ธ์š”. ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด ๋น„ํšจ์œจ์ ์ด๊ณ , ๋„ˆ๋ฌด ํฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ํŒŒ์ผ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ๋“œ๋ฝ์— ์ฃผ์˜ํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ์˜ ์ž ๊ธˆ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ฌดํ•œํžˆ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ์–ด์š”.
  5. mmap()์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŒŒ์ผ ํฌ๊ธฐ ๋ณ€๊ฒฝ์— ์ฃผ์˜ํ•˜์„ธ์š”. ๋งคํ•‘๋œ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋Š” ์ ‘๊ทผ์€ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค๊ณผ ์ฃผ์˜์‚ฌํ•ญ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋Š” ๋•Œ๋กœ๋Š” ๋ณต์žกํ•˜๊ณ  ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋งŒํผ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ •๊ตํ•œ ์‹œ๊ณ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ . ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”! ๐Ÿ•ฐ๏ธ

๐ŸŽญ ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์ด๋ฉด

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O์˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ํ•˜์ง€๋งŒ ์ด๋“ค์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ์ค‘์š”ํ•œ์ง€ ๋” ๊นŠ์ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด์š”. ๋งˆ์น˜ ๋ฌด๋Œ€ ์œ„์˜ ๊ณต์—ฐ์„ ๋ณด๋Š” ๊ฒƒ์—์„œ ๋‚˜์•„๊ฐ€, ๋ฌด๋Œ€ ๋’ค์˜ ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฑฐ์ฃ !

1. ์ปค๋„๊ณผ์˜ ๋Œ€ํ™” ๐Ÿ“ž

์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค, ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์‹ค ์šด์˜์ฒด์ œ์˜ ์ปค๋„๊ณผ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๊ณ  ์žˆ์–ด์š”. ์ด๋Š” ๋งˆ์น˜ ๋ ˆ์Šคํ† ๋ž‘์—์„œ ์ฃผ๋ฐฉ(์ปค๋„)์— ์ฃผ๋ฌธ์„ ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ .

๐Ÿ’ก ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”?

์‹œ์Šคํ…œ ์ฝœ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์ด ์ž ์‹œ ์ค‘๋‹จ๋˜๊ณ , ์ œ์–ด๊ถŒ์ด ์ปค๋„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ปค๋„์ด ์š”์ฒญ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ๋‹ค์‹œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ œ์–ด๊ถŒ์ด ๋Œ์•„์™€์š”. ์ด ๊ณผ์ •์„ '์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ'์ด๋ผ๊ณ  ํ•ด์š”.

2. ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ โšก

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋Š” ๊ณ ์ˆ˜์ค€ I/O (์˜ˆ: fopen, fread ๋“ฑ)์— ๋น„ํ•ด ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์–ด์š”. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

  • ์ง์ ‘ ์ œ์–ด: ๋ฒ„ํผ๋ง์ด๋‚˜ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ ์—†์ด ์ง์ ‘ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”.
  • ์„ธ๋ฐ€ํ•œ ์ตœ์ ํ™”: ํŠน์ • ์ƒํ™ฉ์— ๋งž์ถฐ ๋” ํšจ์œจ์ ์ธ I/O ์ „๋žต์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ: ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ๋” ์ž˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.

3. ๋ณด์•ˆ๊ณผ ๊ถŒํ•œ ๐Ÿ”

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŒŒ์ผ ๊ถŒํ•œ๊ณผ ๋ณด์•ˆ์— ๋”์šฑ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ด์š”. open() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ •ํ•˜๋Š” ๋ชจ๋“œ์™€ ํ”Œ๋ž˜๊ทธ๋Š” ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


int fd = open("secret.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
  

์ด ์ฝ”๋“œ๋Š” 'secret.txt' ํŒŒ์ผ์„ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด๊ณ , ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œ์œ ์ž์—๊ฒŒ๋งŒ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ฃ .

๐Ÿšจ ์ฃผ์˜์‚ฌํ•ญ

๋ถ€์ ์ ˆํ•œ ํŒŒ์ผ ๊ถŒํ•œ ์„ค์ •์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ํ•ญ์ƒ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ๋งŒ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

4. ์ด์‹์„ฑ๊ณผ ํ‘œ์ค€ํ™” ๐ŸŒ

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O ํ•จ์ˆ˜๋“ค์€ POSIX ํ‘œ์ค€์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ UNIX-like ์‹œ์Šคํ…œ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์š”. ํ•˜์ง€๋งŒ Windows์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์šด์˜์ฒด์ œ์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด์‹์„ฑ์„ ๋†’์ด๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šด์˜์ฒด์ œ๋ณ„๋กœ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
  • ์ด์‹์„ฑ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ (์˜ˆ: Apache Portable Runtime)
  • ๊ฐ€๋Šฅํ•œ ํ•œ ํ‘œ์ค€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ ์‚ฌ์šฉ

5. ๋””๋ฒ„๊น…๊ณผ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๐Ÿ”

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ๋•Œ๋กœ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ์™€ ๊ธฐ๋ฒ•์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • strace: ์‹œ์Šคํ…œ ์ฝœ์„ ์ถ”์ ํ•˜์—ฌ ์–ด๋–ค ํ˜ธ์ถœ์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • perror(): ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • valgrind: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.

#include <stdio.h>
#include <errno.h>

if (close(fd) == -1) {
    perror("ํŒŒ์ผ ๋‹ซ๊ธฐ ์‹คํŒจ");
    printf("์—๋Ÿฌ ๋ฒˆํ˜ธ: %d\n", errno);
}
  

์ด๋ ‡๊ฒŒ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ผผ๊ผผํžˆ ํ•˜๋ฉด, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋” ์‰ฝ๊ฒŒ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ฒฐ๋ก : ํž˜์€ ๊ณง ์ฑ…์ž„ ๐Ÿฆธโ€โ™‚๏ธ

์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๊ทธ๋งŒํผ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋‹ค๋ค„์•ผ ํ•ด์š”. ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์šด์˜์ฒด์ œ์™€ ๋” ๊ฐ€๊น๊ฒŒ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ณ , ๋” ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์‹œ์— ๋” ๋งŽ์€ ์ฑ…์ž„๊ฐ๋„ ํ•„์š”ํ•˜์ฃ .

์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ €์ˆ˜์ค€ ํŒŒ์ผ I/O๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ๊ฐ•๋ ฅํ•œ ๋งˆ๋ฒ•์„ ๋‹ค๋ฃจ๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ทธ ํž˜์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์ง„์ •ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿง™โ€โ™‚๏ธโœจ