splice(2) - wariua/manpages-ko GitHub Wiki
splice - ํ์ดํ์ ๋ฐ์ดํฐ ์ด์ด ๋ถ์ด๊ธฐ
#define _GNU_SOURCE /* feature_test_macros(7) ์ฐธ๊ณ */
#include <fcntl.h>
ssize_t splice(int fd_in, loff_t *off_in, int fd_out,
loff_t *off_out, size_t len, unsigned int flags);
splice()
๋ ์ปค๋ ์ฃผ์ ๊ณต๊ฐ๊ณผ ์ฌ์ฉ์ ์ฃผ์ ๊ณต๊ฐ ์ฌ์ด ๋ณต์ฌ ์์ด ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธด๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ fd_in
์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ fd_out
์ผ๋ก ์ต๋ len
๋ฐ์ดํธ๊น์ง ๋ฐ์ดํฐ๋ฅผ ์ด๋์ํค๋๋ฐ, ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ค ํ๋๋ ํ์ดํ๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ๋ค.
fd_in
๊ณผ off_in
์ ๋ค์ ์๋ฏธ๋ก ์ด ์ ์ฉ๋๋ค.
-
fd_in
์ด ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค๋ฉดoff_in
์ด NULL์ด์ด์ผ ํ๋ค. -
fd_in
์ด ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค์ง ์๊ณoff_in
์ด NULL์ด๋ผ๋ฉด ํ์ผ ์คํ์ ๋ถํฐ ์์ํด์fd_in
์์ ๋ฐ์ดํธ๋ค์ ์ฝ์ด ๋ค์ด๋ฉฐ, ํ์ผ ์คํ์ ์ ์ ์ ํ ์กฐ์ ํ๋ค. -
fd_in
์ด ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค์ง ์๊ณoff_in
์ด NULL์ด ์๋๋ผ๋ฉดoff_in
์fd_in
์์ ๋ฐ์ดํธ๋ค์ ์ฝ์ด ๋ค์ด๊ธฐ ์์ํ ์คํ์ ์ ๋ํ๋ด๋ ๋ฒํผ๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ๋ค. ์ด ๊ฒฝ์ฐ์๋fd_in
์ ํ์ผ ์คํ์ ์ ๋ฐ๊พธ์ง ์๋๋ค.
๋ง์ฐฌ๊ฐ์ง ๋ด์ฉ์ด fd_out
๊ณผ off_out
์ ์ ์ฉ๋๋ค.
flags
์ธ์๋ ๋ค์ ๊ฐ์ 0๊ฐ ์ด์ OR ํด์ ๊ตฌ์ฑํ ๋นํธ ๋ง์คํฌ์ด๋ค.
SPLICE_F_MOVE
-
ํ์ด์ง ๋ณต์ฌ ๋์ ์ด๋์ ์๋ํ๋ค. ์ปค๋์๊ฒ ์ฃผ๋ ํํธ์ผ ๋ฟ์ด๋ค. ํ์ดํ์ ํ์ด์ง๋ฅผ ์ปค๋์ด ์ฎ๊ธธ ์ ์๊ฑฐ๋ ํ์ดํ ๋ฒํผ๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ด์ง๊ฐ ๊ฐ๋ ์ฐจ ์์ง ์์ผ๋ฉด ์ฌ์ ํ ํ์ด์ง๋ฅผ ๋ณต์ฌํ ์๋ ์๋ค. ์ด ํ๋๊ทธ์ ์ด๊ธฐ ๊ตฌํ์ ๋ฒ๊ทธ๊ฐ ๋ง์๊ณ , ๊ทธ๋์ ๋ฆฌ๋
์ค 2.6.21๋ถํฐ๋ no-op์ด๋ค. (
splice()
ํธ์ถ์์๋ ๊ณ์ ํ์ฉํ๋ค.) ํฅํ์ ์ ๋๋ก ๋ ๊ตฌํ์ผ๋ก ๋์ด์๋ ์๋ ์๋ค. SPLICE_F_NONBLOCK
-
I/O์์ ๋ธ๋ก ํ์ง ์๋๋ค. ํ์ดํ ์ด์ด ๋ถ์ด๊ธฐ ๋์์ ๋
ผ๋ธ๋ก ๋ฐฉ์์ผ๋ก ๋ง๋ ๋ค. ๊ทธ๋๋
splice()
๊ฐ ๋ธ๋ก ํ ์๋ ์๋ค. ์ด์ด ๋ถ์ด๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ (O_NONBLOCK
ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์์ง ์๋ค๋ฉด) ๋ธ๋ก ํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. SPLICE_F_MORE
-
์ด์ด์ง๋
splice()
๋ก ๋ฐ์ดํฐ๊ฐ ๋ ์ฌ ์์ ์ด๋ค.fd_out
์ด ์์ผ์ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ์ ์ ์ฉํ ํํธ์ด๋ค. (send(2)์MSG_MORE
์ค๋ช ๊ณผ tcp(7)์TCP_CORK
์ค๋ช ์ฐธ๊ณ .) SPLICE_F_GIFT
-
splice()
์์๋ ์ฐ์ง ์๋๋ค. vmsplice(2) ์ฐธ๊ณ .
์ฑ๊ณต ์๋ฃ ์ splice()
๋ ํ์ดํ์ ์ด์ด ๋ถ์ธ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค.
๋ฐํ ๊ฐ 0์ ์
๋ ฅ ๋์ ๋ํ๋ธ๋ค. fd_in
์ด ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ์๋ ์ด๋์ํฌ ๋ฐ์ดํฐ๊ฐ ์์์ผ๋ฉฐ ํ์ดํ์ ์ฐ๊ธฐ ์ชฝ์ ์ฐ๊ฒฐ๋ ์ฐ๊ธฐ ์ํ์๊ฐ ์์ด์ ๋ธ๋ก ํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์์์ ๋ปํ๋ค.
์ค๋ฅ ์ splice()
๋ -1์ ๋ฐํํ๋ฉฐ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋๋ก errno
๋ฅผ ์ค์ ํ๋ค.
EAGAIN
-
flags
์SPLICE_F_NONBLOCK
์ด ์ง์ ๋์๊ฑฐ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค ์ค ํ๋์ ๋ ผ๋ธ๋กํน ํ์(O_NONBLOCK
)๊ฐ ๋ผ ์๋๋ฐ ๋์์ด ๋ธ๋ก ๋๋ ค ํ๋ค. EBADF
- ํ์ชฝ ๋ด์ง ์์ชฝ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ ํจํ์ง ์๊ฑฐ๋ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ชจ๋๊ฐ ์ฌ๋ฐ๋ฅด์ง ์๋ค.
EINVAL
- ๋์ ํ์ผ ์์คํ ์์ ์ด์ด ๋ถ์ด๊ธฐ๋ฅผ ์ง์ํ์ง ์๋๋ค.
EINVAL
- ๋์ ํ์ผ์ด ๋ง๋ถ์ด๊ธฐ ๋ชจ๋๋ก ์ด๋ ค ์๋ค.
EINVAL
- ์ด๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ง ์๋ค.
EINVAL
- ํ์ ๋ถ๊ฐ๋ฅ ์ฅ์น(๊ฐ๋ น ํ์ดํ)์ ์คํ์ ์ ์ฃผ์๋ค.
EINVAL
-
fd_in
๊ณผfd_out
์ด ๊ฐ์ ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค. ENOMEM
- ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ.
ESPIPE
-
off_in
์ด๋off_out
์ด NULL์ด ์๋๋ฐ ๋์ํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
๋ฆฌ๋
์ค 2.6.17์์ splice()
์์คํ
ํธ์ถ์ด ์ฒ์ ๋ฑ์ฅํ๋ค. glibc ๋ฒ์ 2.5์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ด ์ถ๊ฐ๋์๋ค.
์ด ์์คํ ํธ์ถ์ ๋ฆฌ๋ ์ค ์ ์ฉ์ด๋ค.
์ธ ๊ฐ์ง ์์คํ
ํธ์ถ splice()
, vmsplice(2), tee(2)๋ฅผ ํตํด ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์์ ์์ ์ปค๋ ๋ฒํผ๋ฅผ ์์ ํ ์ ์ดํ ์ ์๋๋ฐ, ๊ทธ ๋ฒํผ๋ ์ปค๋ ๋ด์์ ํ์ดํ์ ์ฐ๋ ๋ฒํผ์ ๊ฐ์ ํ์
์ผ๋ก ๊ตฌํ๋์ด ์๋ค. ์ด ์์คํ
ํธ์ถ๋ค์ ๋๋ต ๋ค์ ์์
์ ์ํํ๋ค.
splice()
- ๋ฒํผ์์ ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก, ๋๋ ๋ฐ๋๋ก, ๋๋ ํ ๋ฒํผ์์ ๋ค๋ฅธ ๋ฒํผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธด๋ค.
- tee(2)
- ํ ๋ฒํผ์์ ๋ค๋ฅธ ๋ฒํผ๋ก ๋ฐ์ดํฐ๋ฅผ "๋ณต์ฌ"ํ๋ค.
- vmsplice(2)
- ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๋ฒํผ๋ก ๋ฐ์ดํฐ๋ฅผ "๋ณต์ฌ"ํ๋ค.
๋ณต์ฌ๋ผ๊ณ ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ค์ ๋ณต์ฌ๋ฅผ ํผํ๋ค. ์ด๋ฅผ ์ํด ์ปค๋์์๋ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง์ ๋ํ ์ฐธ์กฐ ์นด์ดํธ ํฌ์ธํฐ๋ค์ ์งํฉ์ผ๋ก ํ์ดํ ๋ฒํผ๋ฅผ ๊ตฌํํ๋ค. ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํค๋ (์ถ๋ ฅ ๋ฒํผ๋ฅผ ์ํ) ์ ํฌ์ธํฐ๋ฅผ ์์ฑํ๊ณ ๊ทธ ํ์ด์ง์ ๋ํ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฌ๋ฆฌ๋ ๊ฒ์ผ๋ก ๋ฒํผ ๋ด์ ํ์ด์ง "์ฌ๋ณธ"์ ์์ฑํ๋ค. ์ฆ, ๋ฒํผ ํ์ด์ง๊ฐ ์๋๋ผ ํฌ์ธํฐ๋ง ๋ณต์ฌํ๋ค.
๋ฆฌ๋
์ค 2.6.30 ๋ฐ ์ด์ ์์๋ fd_in
๊ณผ fd_out
์ค ํ์ชฝ๋ง ํ์ดํ์ฌ์ผ ํ๋ค. ๋ฆฌ๋
์ค 2.6.31๋ถํฐ ๋ ์ธ์ ๋ชจ๋ ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ค.
tee(2) ์ฐธ๊ณ .
copy_file_range(2), sendfile(2), tee(2), vmsplice(2), pipe(7)
2019-05-09