tee(2) - wariua/manpages-ko GitHub Wiki
tee - ํ์ดํ ๋ด์ฉ๋ฌผ ๋ณต์ ํ๊ธฐ
#define _GNU_SOURCE /* feature_test_macros(7) ์ฐธ๊ณ */
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);
tee()
๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ fd_in
์ด ๊ฐ๋ฆฌํค๋ ํ์ดํ์์ ์จ ๋ฐ์ดํฐ๋ฅผ ํ์ผ ๋์คํฌ๋ฆฝํฐ fd_out
์ด ๊ฐ๋ฆฌํค๋ ํ์ดํ๋ก ์ต๋ len
๋ฐ์ดํธ๊น์ง ๋ณต์ ํ๋ค. fd_in
์์ ๋ณต์ ํ ๋ฐ์ดํฐ๋ฅผ ์๋ชจํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ด์ด์ง๋ splice(2)๋ก ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ์ ์๋ค.
flags
๋ ๋ค์ ๊ฐ์ 0๊ฐ ์ด์ OR ํด์ ๊ตฌ์ฑํ ๋นํธ ๋ง์คํฌ์ด๋ค.
SPLICE_F_MOVE
- ํ์ฌ
tee()
์ ์๋ฌด ํจ๊ณผ๊ฐ ์๋ค. splice(2) ์ฐธ๊ณ . SPLICE_F_NONBLOCK
- I/O์์ ๋ธ๋ก ํ์ง ์๋๋ค. ์์ธํ ๋ด์ฉ์ splice(2) ์ฐธ๊ณ .
SPLICE_F_MORE
- ํ์ฌ
tee()
์ ์๋ฌด ํจ๊ณผ๊ฐ ์์ง๋ง ํฅํ์ ๊ตฌํ๋ ์๋ ์๋ค. splice(2) ์ฐธ๊ณ . SPLICE_F_GIFT
tee()
์์๋ ์ฐ์ง ์๋๋ค. vmsplice(2) ์ฐธ๊ณ .
์ฑ๊ณต ์๋ฃ ์ tee()
๋ ์
๋ ฅ๊ณผ ์ถ๋ ฅ ๊ฐ์ ๋ณต์ ํ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค. ๋ฐํ ๊ฐ 0์ ์ด๋์ํฌ ๋ฐ์ดํฐ๊ฐ ์์์ผ๋ฉฐ fd_in
์ด ๊ฐ๋ฆฌํค๋ ํ์ดํ์ ์ฐ๊ธฐ ์ชฝ์ ์ฐ๊ฒฐ๋ ์ฐ๊ธฐ ์ํ์๊ฐ ์์ด์ ๋ธ๋ก ํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์์์ ๋ปํ๋ค.
์ค๋ฅ ์ tee()
๋ -1์ ๋ฐํํ๋ฉฐ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋๋ก errno
๋ฅผ ์ค์ ํ๋ค.
EAGAIN
-
flags
์SPLICE_F_NONBLOCK
์ด ์ง์ ๋์๊ฑฐ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค ์ค ํ๋์ ๋ ผ๋ธ๋กํน ํ์(O_NONBLOCK
)๊ฐ ๋ผ ์๋๋ฐ ๋์์ด ๋ธ๋ก ๋๋ ค ํ๋ค. EINVAL
-
fd_in
์ด๋fd_out
์ด ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ง ์๋ค. ๋๋fd_in
๊ณผfd_out
์ด ๊ฐ์ ํ์ดํ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค. ENOMEM
- ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ.
๋ฆฌ๋
์ค 2.6.17์์ tee()
์์คํ
ํธ์ถ์ด ์ฒ์ ๋ฑ์ฅํ๋ค. glibc ๋ฒ์ 2.5์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ด ์ถ๊ฐ๋์๋ค.
์ด ์์คํ ํธ์ถ์ ๋ฆฌ๋ ์ค ์ ์ฉ์ด๋ค.
๊ฐ๋
์ ์ผ๋ก tee()
๋ ๋ ํ์ดํ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ค. ํ์ง๋ง ์ค์ ๋ก๋ ์ด๋ค ๋ฐ์ดํฐ ๋ณต์ฌ๋ ์ด๋ค์ง์ง ์๋๋ค. ๋ด๋ถ์ ์ผ๋ก tee()
๋ ์
๋ ฅ์ ๋ํ ์ฐธ์กฐ๋ง ์ก๊ณ ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ ์ชฝ์ผ๋ก ํ ๋นํ๋ค.
์๋ ์์์๋ tee()
์์คํ
ํธ์ถ์ ์ด์ฉํด ๊ธฐ๋ณธ์ ์ธ tee(1)
ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ค. ๋ค์์ด ์ฌ์ฉ ์์์ด๋ค.
$ date |./a.out out.log | cat
Tue Oct 28 10:06:00 CET 2014
$ cat out.log
Tue Oct 28 10:06:00 CET 2014
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
int
main(int argc, char *argv[])
{
int fd;
int len slen;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
do {
/*
* stdin์ stdout์ผ๋ก ๋ถ๊ธฐ ์ฐ๊ฒฐ.
*/
len = tee(STDIN_FILENO, STDOUT_FILENO,
INT_MAX, SPLICE_F_NONBLOCK);
if (len < 0) {
if (errno == EAGAIN)
continue;
perror("tee");
exit(EXIT_FAILURE);
} else
if (len == 0)
break;
/*
* stdin์ ํ์ผ๋ก ์ฐ๊ฒฐํด์ ๋ฐ์ดํฐ ๋จน๊ธฐ.
*/
while (len > 0) {
slen = splice(STDIN_FILENO, NULL, fd, NULL,
len, SPLICE_F_MOVE);
if (slen < 0) {
perror("splice");
break;
}
len -= slen;
}
} while (1);
close(fd);
exit(EXIT_SUCCESS);
}
splice(2), vmsplice(2), pipe(7)
2019-03-06