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)