readv(2) - wariua/manpages-ko GitHub Wiki
readv, writev, preadv, pwritev, preadv2, pwritev2 - ์ฌ๋ฌ ๋ฒํผ๋ก ๋ฐ์ดํฐ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
ssize_t preadv(int fd, const struct iovec *iov, int iovcnt,
off_t offset);
ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,
off_t offset);
ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt,
off_t offset, int flags);
ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt,
off_t offset, int flags);
glibc ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก ์๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):
-
preadv()
,pwritev()
: -
- glibc 2.19๋ถํฐ:
_DEFAULT_SOURCE
- glibc 2.19 ๋ฐ ์ด์ :
_BSD_SOURCE
readv()
์์คํ
ํธ์ถ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ fd
์ ์ฐ๊ณ๋ ํ์ผ์์ iov
๊ฐ ๊ธฐ์ ํ๋ ๋ฒํผ๋ค๋ก iovcnt
๊ฐ ๋ฒํผ๋ฅผ ์ฝ์ด ๋ค์ธ๋ค ("์ค์บํฐ ์
๋ ฅ").
writev()
์์คํ
ํธ์ถ์ iov
๊ฐ ๊ธฐ์ ํ๋ iovcnt
๊ฐ ๋ฐ์ดํฐ ๋ฒํผ๋ฅผ ํ์ผ ๋์คํฌ๋ฆฝํฐ fd
์ ์ฐ๊ณ๋ ํ์ผ๋ก ๊ธฐ๋กํ๋ค ("๊ฐ๋ ์ถ๋ ฅ").
ํฌ์ธํฐ iov
๋ <sys/uio.h>
์ ๋ค์์ฒ๋ผ ์ ์๋ iovec
๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํจ๋ค.
struct iovec {
void *iov_base; /* ์์ ์ฃผ์ */
size_t iov_len; /* ์ด๋ํ ๋ฐ์ดํธ ์ */
};
readv()
์์คํ
ํธ์ถ์ ์ฌ๋ฌ ๋ฒํผ๋ฅผ ์ฑ์ด๋ค๋ ์ ์ ๋นผ๋ฉด read(2)
์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ํ๋ค.
writev()
์์คํ
ํธ์ถ์ ์ฌ๋ฌ ๋ฒํผ๋ฅผ ์จ๋ฃ๋๋ค๋ ์ ์ ๋นผ๋ฉด write(2)
์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ํ๋ค.
๋ฒํผ๋ค์ ๋ฐฐ์ด ๋ด ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋๋ค. ์ฆ readv()
์์ iov[0]
๋ฅผ ์์ ํ ์ฑ์ด ๋ค์ iov[1]
๋ก ์งํํ๋ ์์ด๋ค. (๋ฐ์ดํฐ๊ฐ ์ถฉ๋ถํ ์์ผ๋ฉด iov
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฒํผ๋ค์ด ๋ชจ๋ ์ฑ์์ง์ง ์์ ์๋ ์๋ค.) ๋ง์ฐฌ๊ฐ์ง๋ก writev()
์์๋ iov[0]
์ ๋ด์ฉ ์ ์ฒด๋ฅผ ์จ๋ฃ์ ๋ค์ iov[1]
๋ก ์งํํ๋ ์์ด๋ค.
readv()
์ writev()
๊ฐ ์ํํ๋ ๋ฐ์ดํฐ ์ด๋์ ์์์ ์ด๋ค. ์ฆ writev()
๊ฐ ์จ๋ฃ๋ ๋ฐ์ดํฐ๋ ํ ๋ฉ์ด๋ฆฌ๋ก ๊ธฐ๋ก๋๋ฉฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ฐ๊ธฐ ์ถ๋ ฅ๊ณผ ์์ด์ง ์๋๋ค. (ํ์ง๋ง pipe(7)์ ์์ธ ์ฐธ๊ณ .) ์ ์ฌํ๊ฒ readv()
๋ ๊ฐ์ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ(open(2) ์ฐธ๊ณ )์ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ฐ์ง ๋ค๋ฅธ ์ค๋ ๋ ๋ด์ง ํ๋ก์ธ์ค์์์ ์ฝ๊ธฐ ๋์๊ณผ ์๊ด์์ด ํ์ผ๋ก๋ถํฐ ์ฐ์์ธ ๋ฉ์ด๋ฆฌ๋ฅผ ์ฝ๋๋ค๊ณ ๋ณด์ฅ๋๋ค.
preadv()
์์คํ
ํธ์ถ์ readv()
์ pread(2)์ ๊ธฐ๋ฅ์ ํฉ์น ๊ฒ์ด๋ค. readv()
์ ๊ฐ์ ์ผ์ ์ํํ๋ ๋ค ๋ฒ์งธ ์ธ์ offset
์ด ์ถ๊ฐ๋ผ์ ์
๋ ฅ ๋์์ ์ํํ ํ์ผ ์คํ์
์ ์ง์ ํ ์ ์๋ค.
pwritev()
์์คํ
ํธ์ถ์ writev()
์ pwrite(2)์ ๊ธฐ๋ฅ์ ํฉ์น ๊ฒ์ด๋ค. writev()
์ ๊ฐ์ ์ผ์ ์ํํ๋ ๋ค ๋ฒ์งธ ์ธ์ offset
์ด ์ถ๊ฐ๋ผ์ ์ถ๋ ฅ ๋์์ ์ํํ ํ์ผ ์คํ์
์ ์ง์ ํ ์ ์๋ค.
์ด ์์คํ
ํธ์ถ๋ค์ ํ์ผ ์คํ์
์ ๋ฐ๊พธ์ง ์๋๋ค. fd
๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ผ์์ seek์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
์ด ์์คํ
ํธ์ถ๋ค์ preadv()
๋ฐ pwritev()
ํธ์ถ๊ณผ ๋น์ทํ๋ ๋ค์ฏ ๋ฒ์งธ ์ธ์ flags
๊ฐ ์ถ๊ฐ๋ผ์ ํธ์ถ๋ณ๋ก ๋์ ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์๋ค.
preadv()
๋ฐ pwritev()
์ ๋ฌ๋ฆฌ offset
์ธ์๊ฐ -1์ด๋ฉด ํ์ฌ ํ์ผ ์คํ์
์ ์ฌ์ฉํ๊ณ ๊ฐฑ์ ํ๋ค.
flags
์ธ์๋ ๋ค์ ํ๋๊ทธ๋ฅผ 0๊ฐ ์ด์ ๋นํธ OR ํ ๊ฐ์ ๋ด๋๋ค.
-
RWF_DSYNC
(๋ฆฌ๋ ์ค 4.7๋ถํฐ) - ์ฐ๊ธฐ๋ณ๋ก ์ง์ ํ ์ ์๋ open(2)
O_DSYNC
ํ๋๊ทธ์ ๋ฑ๊ฐ๋ฌผ. ์ด ํ๋๊ทธ๋pwritev2()
์๋ง ์ ํจํ๋ฉฐ ์์คํ ํธ์ถ๋ก ๊ธฐ๋กํ๋ ๋ฐ์ดํฐ ๋ฒ์์๋ง ์ ์ฉ๋๋ค. -
RWF_HIPRI
(๋ฆฌ๋ ์ค 4.6๋ถํฐ) - ์ฐ์ ๋ ๋์ ์ฝ๊ธฐ/์ฐ๊ธฐ. ๋ธ๋ก ๊ธฐ๋ฐ ํ์ผ ์์คํ
์์ ์ฅ์น ํด๋ง์ ํ ์ ์๊ฒ ํ์ฉํ๋ค. ์ง์ฐ์ด ๋ฎ์์ง์ง๋ง ์์์ ๋ ์ธ ์๋ ์๋ค. (ํ์ฌ ์ด ๊ธฐ๋ฅ์
O_DIRECT
ํ๋๊ทธ๋ก ์ฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.) -
RWF_SYNC
(๋ฆฌ๋ ์ค 4.7๋ถํฐ) - ์ฐ๊ธฐ๋ณ๋ก ์ง์ ํ ์ ์๋ open(2)
O_SYNC
ํ๋๊ทธ์ ๋ฑ๊ฐ๋ฌผ. ์ด ํ๋๊ทธ๋pwritev2()
์๋ง ์ ํจํ๋ฉฐ ์์คํ ํธ์ถ๋ก ๊ธฐ๋กํ๋ ๋ฐ์ดํฐ ๋ฒ์์๋ง ์ ์ฉ๋๋ค. -
RWF_NOWAIT
(๋ฆฌ๋ ์ค 4.14๋ถํฐ) - ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ๊ธฐ๋ฐ ์ ์ฅ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์์ผ ํ๊ฑฐ๋ ๋ฝ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝ์ฐ์
preadv2()
์์คํ ํธ์ถ์ด ์ฆ์ ๋ฐํํ๊ฒ ๋๋ค. ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฝ์์ผ๋ฉด ์ฝ์ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค. ์ฝ์ ๋ฐ์ดํธ๊ฐ ์์ผ๋ฉด -1์ ๋ฐํํ๊ณerrno
๋ฅผEAGAIN
์ผ๋ก ์ค์ ํ๋ค. ํ์ฌ ์ด ํ๋๊ทธ๋preadv2()
์๋ง ์ ํจํ๋ค. -
RWF_APPEND
(๋ฆฌ๋ ์ค 4.16๋ถํฐ) - ์ฐ๊ธฐ๋ณ๋ก ์ง์ ํ ์ ์๋ open(2)
O_APPEND
ํ๋๊ทธ์ ๋ฑ๊ฐ๋ฌผ. ์ด ํ๋๊ทธ๋pwritev2()
์๋ง ์ ํจํ๋ฉฐ ์์คํ ํธ์ถ๋ก ๊ธฐ๋กํ๋ ๋ฐ์ดํฐ ๋ฒ์์๋ง ์ ์ฉ๋๋ค.offset
์ธ์๊ฐ ์ฐ๊ธฐ ๋์์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ ํญ์ ํ์ผ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ถ์ธ๋ค. ๋ค๋งoffset
์ธ์๊ฐ -1์ด๋ฉด ํ์ฌ ํ์ผ ์คํ์ ์ ๊ฐฑ์ ํ๋ค.
์ฑ๊ณต ์ readv()
, preadv()
, preadv2()
๋ ์ฝ์ด ๋ค์ธ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค. writev()
, pwritev()
, pwritev2()
๋ ๊ธฐ๋กํ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค.
์ฑ๊ณตํ ํธ์ถ์์ ์์ฒญ๋ณด๋ค ์ ์ ๋ฐ์ดํธ๋ฅผ ์ด๋ํ ๊ฒ์ด ์ค๋ฅ๊ฐ ์๋๋ผ๋ ์ ์ ์ ์ํ๋ผ. (read(2)
๋ฐ write(2)
์ฐธ๊ณ .)
์ค๋ฅ ์ -1์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค.
์ค๋ฅ๋ read(2)
๋ฐ write(2)
์์์ ๊ฐ๋ค. ๋๋ถ์ด preadv()
, preadv2()
, pwritev()
, pwritev2()
๊ฐ lseek(2)๊ณผ ๊ฐ์ ์ด์ ๋ก ์คํจํ ์๋ ์๋ค. ์ถ๊ฐ๋ก ๋ค์ ์ค๋ฅ๋ค์ด ์ ์๋ผ ์๋ค.
EINVAL
-
iov_len
๊ฐ๋ค์ ํฉ์ดssize_t
๊ฐ์ ๋์น๊ฒ ํ๋ค. EINVAL
- ๋ฒกํฐ ์นด์ดํธ
iovcnt
๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ํ์ฉ ์ต๋์น๋ณด๋ค ํฌ๋ค. EOPNOTSUPP
-
flags
์ ์ ์ ์๋ ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ค.
๋ฆฌ๋
์ค 2.6.30์์ preadv()
์ pwritev()
๊ฐ ์ฒ์ ๋ฑ์ฅํ๋ค. glibc 2.10์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ด ์ถ๊ฐ๋์๋ค.
๋ฆฌ๋
์ค 4.6์์ preadv2()
์ pwritev2()
๊ฐ ์ฒ์ ๋ฑ์ฅํ๋ค. glibc 2.26์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ด ์ถ๊ฐ๋์๋ค.
readv()
, writev()
: POSIX.1-2001, POSIX.1-2008, 4.4BSD (4.2BSD์์ ์ด ์์คํ
ํธ์ถ๋ค์ด ์ฒ์ ๋ฑ์ฅ).
preadv()
, pwritev()
: ๋นํ์ค, ํ์ง๋ง ์ต์ BSD๋ค์๋ ์์.
preadv2()
, pwritev2()
: ๋นํ์ค ๋ฆฌ๋
์ค ํ์ฅ.
POSIX.1์์๋ iov
์ ์ ๋ฌํ ์ ์๋ ํญ๋ชฉ ๊ฐ์์ ๋ํ ์ ํ์ ๊ตฌํ์์ ๋ ์ ์๊ฒ ํ์ฉํ๋ค. ๊ตฌํ์์ <limits.h>
์ IOV_MAX
๋ฅผ ์ ์ํ๊ฑฐ๋ ๋ฐํ์์ sysconf(_SC_IOV_MAX)
๋ฐํ ๊ฐ์ ํตํด ๊ทธ ์ ํ๊ฐ์ ์ ์ ํ ์ ์๋ค. ์์ฆ ๋ฆฌ๋
์ค ์์คํ
์์๋ ๊ทธ ์ ํ์ด 1024์ด๋ค. ๋ฆฌ๋
์ค 2.0 ์์ ์๋ ๊ทธ ์ ํ์ด 16์ด์๋ค.
์ง์ง preadv()
๋ฐ pwritev()
์์คํ
ํธ์ถ์ ํธ์ถ ์๊ทธ๋์ฒ๋ SYNOPSIS์ ์๋ ๋์ํ๋ GNU C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ํผ ํจ์์ ์ด์ง ๋ค๋ฅด๋ค. ๋ํผ ํจ์์ ๋ง์ง๋ง ์ธ์ offset
์ ์์คํ
ํธ์ถ์์๋ ๋ ๊ฐ ์ธ์๋ก ๋๋๋ค.
unsigned long pos_l, unsigned long pos
์ด ์ธ์๋ค์ ๊ฐ๊ฐ offset
์ ํ์ 32๋นํธ์ ์์ 32๋นํธ๋ฅผ ๋ด๋๋ค.
๋ฆฌ๋
์ค ์ด๊ธฐ ๋ฒ์ ์์ IOV_MAX
๊ฐ ์์ฃผ ๋ฎ์๋ ๊ฒ์ ๋์ฒํ๊ธฐ ์ํด glibc์ readv()
๋ฐ writev()
๋ํผ ํจ์์์๋ ๊ธฐ๋ฐ ์ปค๋ ์์คํ
ํธ์ถ์ด ๊ทธ ์ ํ ์ด๊ณผ ๋๋ฌธ์ ์คํจํ์์ ๊ฐ์งํ ๊ฒฝ์ฐ ์ด๋ค ์ถ๊ฐ ์์
์ ํด ์ฃผ์๋ค. readv()
์ ๊ฒฝ์ฐ ๋ํผ ํจ์์์ iov
์ ํญ๋ชฉ๋ค์ ๋ชจ๋ ๋ด์ ๋งํผ ํฐ ์์ ๋ฒํผ๋ฅผ ํ ๋นํด์ ๊ทธ ๋ฒํผ๋ก read(2)
ํธ์ถ์ ํ ๋ค์ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ iov
ํญ๋ชฉ๋ค์ iov_base
ํ๋์ ์ง์ ๋ ์์น๋ก ๋ณต์ฌํ๊ณ ์ ๋ฒํผ๋ฅผ ํด์ ํ๋ค. writev()
์ ๋ํผ ํจ์๋ ์์ ๋ฒํผ์ write(2)
ํธ์ถ๋ก ๋น์ทํ ์์
์ ์ํํ๋ค.
๋ฆฌ๋ ์ค 2.2 ๋ฐ ์ดํ๋ถํฐ๋ glibc ๋ํผ ํจ์์์ ์ด๋ฐ ์ถ๊ฐ ์์ ์ด ํ์ ์๊ฒ ๋์๋ค. ํ์ง๋ง glibc๋ ๋ฒ์ 2.10๊น์ง ์ด ๋์์ ๊ณ์ ์ ๊ณตํ๋ค. glibc ๋ฒ์ 2.9๋ถํฐ๋ ์์คํ ์ด ๋ฆฌ๋ ์ค ์ปค๋ 2.6.18(์์๋ก ์ ์ ํ ์ปค๋ ๋ฒ์ )๋ณด๋ค ์ค๋ ๋ ๋ฒ์ ์์ ๋์ ์ค์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ์งํ ๊ฒฝ์ฐ์๋ง ๋ํผ ํจ์๊ฐ ์ด ๋์์ ์ ๊ณตํ๋ค. (์ต์๋ก ์๊ตฌํ๋ ๋ฆฌ๋ ์ค ์ปค๋ ๋ฒ์ ์ด 2.6.32์ธ) glibc 2.20๋ถํฐ๋ ์ธ์ ๋ glibc ๋ํผ ํจ์์์ ์์คํ ํธ์ถ์ ๋ฐ๋ก ๋ถ๋ฅธ๋ค.
๋ค์ ์ฝ๋ ์ํ์ด writev()
์ฌ์ฉ ๋ฐฉ์์ ๋ณด์ฌ ์ค๋ค.
char *str0 = "hello ";
char *str1 = "world\n";
struct iovec iov[2];
ssize_t nwritten;
iov[0].iov_base = str0;
iov[0].iov_len = strlen(str0);
iov[1].iov_base = str1;
iov[1].iov_len = strlen(str1);
nwritten = writev(STDOUT_FILENO, iov, 2);
pread(2), read(2)
, write(2)
2018-04-30