Robust I O - whdlgp/system_programming_pra GitHub Wiki

Robust I/O(RIO package)

๊ธฐ๋ณธ UNIX I/Oํ•จ์ˆ˜ read, write ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ถˆํŽธํ•œ ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Computer Systems: A Programmer's Perspective ํ•„์ž๊ฐ€ ์ œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ธฐ์กด read๋‚˜ write ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
(Files and I/O, CS61, Lecture 22, November 17, 2011 (Stephen Chong, Harvard School of Engineering and Applied Sciences) ์ฐธ์กฐ)

  • ๊ธฐ์กด UNIX I/O๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ ๋ฐ›๊ณ  ์“ฐ๋Š”๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.
    ์˜ˆ๋ฅผ๋“ค์–ด read(fd, buffer,50); ์„ ํ•œ๋‹ค ํ•ด๋„ ์ฝ์„ ๋‚ด์šฉ์ด ๋ถ€์กฑํ•˜๋ฉด ์ฝ์€ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜์ง€, 50๊ฐœ๋ฅผ ์ฒด์šฐ๋ ค๊ณ  ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ„ฐ๋ฏธ๋„์—์„œ ctrl + c๋ฅผ ํ•˜๋ฉด ์ธํ„ฐ๋ŸฝํŠธ ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ๋™์ž‘์ด ๋ฉˆ์ถ˜๋‹ค.
    ์ด ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ ๋Š”, ๋ช‡๋ช‡ ํŠน์ˆ˜ํ•œ ์ผ€์ด์Šค์—์„œ ์ด๋Ÿฐ ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ•ด๋„ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ๋Š” ๊ณ„์† ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋งค๋ฒˆ ์—๋Ÿฌ์ฒดํฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด ์ฝ”๋“œ๋ฅผ ํ™”๋‚˜๊ฒŒ~~(๋นก์น˜๊ฒŒ)~~ ํ•œ๋‹ค.

์ด๋Ÿฐ ๋ช‡๋ช‡ ๋ถˆํŽธํ•œ ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์‹œ๋œ I/O ๊ฐ€ RIO package๋‹ค. ์†”์งํžˆ ์ฒ˜์Œ์—๋Š” ๋„๋ฐ์ฒด ์ด๊ฒŒ ์™œ ํ•„์š”ํ•˜๋ฉฐ, ๋ฌด์Šจ ์“ธ๋ชจ๊ฐ€ ์žˆ๊ณ , ๊ฒฐ๋ก ์ ์œผ๋กœ ์™œ ์ด๋Ÿฐ ์“ธ๋•Œ์—†์–ด ๋ณด์ด๋Š” ๋™์ž‘์„ ํ•ด์•ผํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—,,, Harvard School of Engineering and Applied Sciences์—์„œ ๊ณผ๊ฑฐ ๊ฐ•์˜ํ•œ cs61 ๊ฐ•์ขŒ๋ฅผ ์ข€ ๋ดค๋‹ค. ๊ทธ๊ณณ์—์„œ ์œ„ ๋ฌธ์ œ์ ๋“ค์„ ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ, ์ €๊ฒŒ ๋ฌธ์ œ์ธ๊ฐ€๋ณด๋‹ค(์•„๋ž˜ ๋‘๊ฐœ๋Š” ์ดํ•ด๊ฐ€ ๋˜๋Š”๋ฐ,,,).

RIO package ๊ฐ€ ํฌํ•จ๋œ csapp.h, csapp.c ํŒŒ์ผ์€ ์•„๋ž˜ ์‚ฌ์ดํŠธ์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

Instructor Site: Code Examples

rio_readn

rio_readn(ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ, ์ €์žฅํ•  ๋ฒ„ํผ, ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ)

๊ทธ๋ƒฅ๋ณด๋ฉด ์ผ๋ฐ˜ read ํ•จ์ˆ˜์™€ ์ธ์ž๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅผ ๊ฒŒ ์—†๋‹ค. ์ผ๋ฐ˜ read ํ•จ์ˆ˜์™€ ๋‹ค๋ฅธ์ ์€ ๋‹ค์Œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ read ํ•˜๋Š”๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.

  • read ๊ฐ€ -1์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ(ํŒŒ์ผ์„ ์—ด์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ฝ๊ธฐ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜ ๋“ฑ๋“ฑ,,,)
  • ํŒŒ์ผ์„ ๋๊นŒ์ง€ ์ „๋ถ€ ์ฝ์—ˆ์„ ๋•Œ

๋‹ค์Œ์˜ ๊ฒฝ์šฐ ๋™์ž‘์„ ๋ฉˆ์ถ”์ง€ ์•Š์Œ

  • sig handler ์— ์˜ํ•œ ์ค‘์ง€(ctrl + c ๊ฐ™์€)

rio_writen

rio_writen(ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ, ์“ฐ๊ธฐ ํ•  ๋ฐ์ดํ„ฐ ๋ฒ„ํผ, ๋ฒ„ํผ ํฌ๊ธฐ) 

์ด ์—ญ์‹œ ์ผ๋ฐ˜ write์™€ ํฌ๊ฒŒ ๋‹ค๋ฅธ์ ์€ ์—†์–ด๋ณด์ด์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค.

  • ์“ฐ๊ธฐ ์ˆ˜ํ–‰์‹œ ์–ธ์ œ๋‚˜ ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ ์“ฐ๊ธฐ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ ค ํ•œ๋‹ค.
  • ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ -1, ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ ์–ธ์ œ๋‚˜ ๋ฆฌํ„ด๊ฐ’์€ ๋ฒ„ํผ ํฌ๊ธฐ์™€ ๊ฐ™๋‹ค.(๊ทธ๋งŒํผ ์“ฐ๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ,,,)

rio_t ๊ตฌ์กฐ์ฒด

/* $begin rio_t */
#define RIO_BUFSIZE 8192
typedef struct {
    int rio_fd;                /* Descriptor for this internal buf */
    int rio_cnt;               /* Unread bytes in internal buf */
    char *rio_bufptr;          /* Next unread byte in internal buf */
    char rio_buf[RIO_BUFSIZE]; /* Internal buffer */
} rio_t;
/* $end rio_t */

Unix read, write ์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด, RIO package ์—์„œ๋Š” rio_t ๋ผ๋Š” ๋ณ„๋„์˜ ๊ตฌ์กฐ์ฒด๊ฐ€ ์กด์ œํ•œ๋‹ค. ์ด ๊ตฌ์กฐ์ฒด์—๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ •๋ณด๋Š” ๋ฌผ๋ก  ๋‚ด๋ถ€์ ์ธ ์ž„์‹œ ๋ฒ„ํผ์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

  • rio_fd
    ๊ธฐ์กด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ •๋ณด
  • rio_cnt
    ๋‚ด๋ถ€ ๋ฒ„ํผ์˜ ์ฝ์€ ๋ฐ”์ดํŠธ ์ˆ˜
    (unread bytes ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๊ฐ’์ด 0์ผ๋•Œ ๋น„์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š”๊ฑธ ๋ณด๋ฉด,,, '์ฝ์ง€ ์•Š์€ ๋ฐ”์ดํŠธ ์ˆ˜' ๊ฐ€ ์•„๋‹ˆ๋ผ '์ฝ์–ด๋“œ๋ฆฐ ๋ฐ”์ดํŠธ ์ˆ˜' ๋ผ๊ณ  ๋ณด๋Š”๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค.)
  • rio_bufptr
    ๋‚ด๋ถ€ ๋ฒ„ํผ์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ํฌ์ธํ„ฐ
  • rio_buf[RIO_BUFSIZE]
    ๋‚ด๋ถ€ ๋ฒ„ํผ

rio_t ๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™”

void rio_readinitb(rio_t *rp, int fd) 
{
    rp->rio_fd = fd;  
    rp->rio_cnt = 0;  
    rp->rio_bufptr = rp->rio_buf;
}

๊ทธ๋ƒฅ rio_t ๊ตฌ์กฐ์ฒด์— ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ •๋ณด๋ฅผ ๋‹ด๊ณ , ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ๋นˆ ๋ฒ„ํผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋‹ค.

rio_read

rio_read(rio_t ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜, ์ €์žฅํ•  ๋ฒ„ํผ, ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ)

rio_readn์™€์˜ ์ฐจ์ด์ ์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋Œ€์‹  rio_t ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•จ์œผ๋กœ์„œ ๊ธฐ์กด read๋™์ž‘์— '๋‚ด๋ถ€ ๋ฒ„ํผ'๋กœ ์ €์žฅ ํ›„ '์ €์žฅํ•  ๋ฒ„ํผ'์— ๋ณต์‚ฌํ•˜๋„๋ก ๋˜์–ด์žˆ๋‹ค.

  • ๋‚ด๋ถ€ ๋ฒ„ํผ๊ฐ€ ๋น„์—ˆ์œผ๋ฉด ์ผ๋‹จ ๋‚ด๋ถ€ ๋ฒ„ํผ๋ถ€ํ„ฐ ์ฒด์šด๋‹ค.
  • read ํ•จ์ˆ˜๊ฐ€ -1 ๋ฆฌํ„ด์‹œ ๊ทธ๋Œ€๋กœ -1 ๋ฆฌํ„ด๊ฐ€
  • ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ์ €์žฅํ•  ๋ฒ„ํผ์— ๋ณต์‚ฌํ•œ๋‹ค.
  • ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ๋ณด๋‹ค ์ ์œผ๋ฉด ์ฝ์€ ๋งŒํผ๋งŒ ๋ฆฌํ„ด, ํฌ๊ธฐ๋งŒํผ ๋‹ค ์ฝ์—ˆ์œผ๋ฉด ํฌ๊ธฐ์™€ ๊ฐ™์€ ๊ฐ’์„ ๋ฆฌํ„ดํ„ด

๋‹ค์Œ์˜ ๊ฒฝ์šฐ ๋™์ž‘์„ ๋ฉˆ์ถ”์ง€ ์•Š์Œ

  • sig handler ์— ์˜ํ•œ ์ค‘์ง€(ctrl + c ๊ฐ™์€)

์‰ฝ๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด, '์ผ๋ฐ˜read + ๋‚ด๋ถ€ ๋ฒ„ํผ๋ง + sig handler ๋Œ€์ฒ˜' ๊ฐ€ ํฌํ•จ๋œ, ์—…๊ทธ๋ ˆ์ด๋“œํŒ read๋‹ค

rio_readn์ด ๋งŒ๋“œ์‹œ ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ ์ฝ์–ด๋“œ๋ฆฌ๋Š”๊ฒƒ์„ ๋ณด์žฅํ–ˆ๋‹ค๋ฉด, rio_read๋Š” ๊ทธ๋Ÿฌํ•œ ์ ์€ ๋ณด์žฅํ•˜์ง€ ์•Š๋˜ ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ‘์ž‘์Šค๋Ÿฐ sig handler ์—๋„ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์กฐ์น˜๋˜์–ด์žˆ๋‹ค.

rio_readnb

rio_readnb(rio_t ๊ตฌ์กฐ์ฒด, ์ €์žฅํ•  ๋ฒ„ํผ, ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ) 

๋‹ค์Œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ read ํ•˜๋Š”๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.

  • rio_read ๊ฐ€ -1์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ(ํŒŒ์ผ์„ ์—ด์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ฝ๊ธฐ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜ ๋“ฑ๋“ฑ,,,)
  • ํŒŒ์ผ์„ ๋๊นŒ์ง€ ์ „๋ถ€ ์ฝ์—ˆ์„ ๋•Œ

๋‹ค์Œ์˜ ๊ฒฝ์šฐ ์ฝ๊ธฐ ๋™์ž‘์„ ๋ฉˆ์ถ”์ง€ ์•Š์Œ

  • sig handler ์— ์˜ํ•œ ์ค‘์ง€(ctrl + c ๊ฐ™์€)

rio_readn๊ณผ ๋‹ค๋ฅธ์ ์€, read ๋Œ€์‹  rio_read๋ฅผ ์ด์šฉํ•˜์—ฌ rio_t ๊ตฌ์กฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ๊ฐ™์ด ํ™œ์šฉํ•˜๋Š” ์ ์ด๋‹ค. ์ฆ‰, rio_readnb ๋ฅผ ํ™œ์šฉํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์ด ๋ณด์žฅ๋œ๋‹ค.

  • ์ฝ๊ธฐ ์ˆ˜ํ–‰์— ์ง€์žฅ์ด ์—†๊ณ , ๋‹ค ์ฝ์€๊ฒŒ ์•„๋‹ˆ๋ฉด, ์ง€์ •ํ•œ ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ ์ฝ๋Š”๋‹ค.
  • sig handler ์— ์˜ํ•œ ๊ฐ‘์ž‘์Šค๋Ÿฐ ์ค‘์ง€๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • rio_t ๊ตฌ์กฐ์ฑ„์˜ ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ํ™œ์šฉํ•ด ๊ฐ‘์ž‘์Šค๋Ÿฐ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ง‰๋Š”๋‹ค.

rio_readlineb

rio_readlineb(rio_t ๊ตฌ์กฐ์ฒด, ์ €์žฅํ•  ๋ฒ„ํผ, ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ)

rio_readnb๊ฐ€ ์ €์žฅํ•  ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ ์ฝ๋Š”๊ฒƒ์„ ๋ณด์žฅํ–ˆ๋‹ค๋ฉด, rio_readlineb๋Š” ํ•œ ์ค„ ๋‹จ์œ„('\n'์œผ๋กœ ๊ตฌ๋ถ„)๋กœ ์ฝ์–ด๋“œ๋ฆฐ๋‹ค.

rio_readlineb ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค.

  • (๊ฐœํ–‰๋ฌธ์ž)'\n'๋ฅผ ๋งŒ๋‚ ๋•Œ๊นŒ์ง€ ์ฝ๋Š”๋‹ค.
  • ์ฝ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ์ฝ๋‹ค๊ฐ€ EOF๋ฅผ ๋งŒ๋‚˜๋ฉด ์ฝ์€ ๋งŒํผ๋งŒ ์ฝ๋Š”๋‹ค.

rio_read๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค์Œ์ด ๋ณด์žฅ๋œ๋‹ค.

  • sig handler ์— ์˜ํ•œ ๊ฐ‘์ž‘์Šค๋Ÿฐ ์ค‘์ง€(ctrl + c ๊ฐ™์€) ๋Œ€์ฒ˜
  • rio_t ๊ตฌ์กฐ์ฑ„์˜ ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ํ™œ์šฉํ•ด ๊ฐ‘์ž‘์Šค๋Ÿฐ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ง‰๋Š”๋‹ค.

๊ทธ ์ด์™ธ์— ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ๊ฒธํ•œ ๋ž˜ํผ ํ•จ์ˆ˜๋“ค๋„ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋‹ˆ ํ™•์ธํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค. (์˜ˆ๋กœ rio_readnb์˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ ํฌํ•จ ํ•จ์ˆ˜๋Š” Rio_readnb)