tee(2) - wariua/manpages-ko GitHub Wiki

NAME

tee - ํŒŒ์ดํ”„ ๋‚ด์šฉ๋ฌผ ๋ณต์ œํ•˜๊ธฐ

SYNOPSIS

#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);

DESCRIPTION

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) ์ฐธ๊ณ .

RETURN VALUE

์„ฑ๊ณต ์™„๋ฃŒ ์‹œ tee()๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ฐ„์— ๋ณต์ œํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’ 0์€ ์ด๋™์‹œํ‚ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์—ˆ์œผ๋ฉฐ fd_in์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ดํ”„์˜ ์“ฐ๊ธฐ ์ชฝ์— ์—ฐ๊ฒฐ๋œ ์“ฐ๊ธฐ ์ˆ˜ํ–‰์ž๊ฐ€ ์—†์–ด์„œ ๋ธ”๋ก ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†์—ˆ์Œ์„ ๋œปํ•œ๋‹ค.

์˜ค๋ฅ˜ ์‹œ tee()๋Š” -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋„๋ก errno๋ฅผ ์„ค์ •ํ•œ๋‹ค.

ERRORS

EAGAIN
flags์— SPLICE_F_NONBLOCK์ด ์ง€์ •๋˜์—ˆ๊ฑฐ๋‚˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค ์ค‘ ํ•˜๋‚˜์— ๋…ผ๋ธ”๋กœํ‚น ํ‘œ์‹œ(O_NONBLOCK)๊ฐ€ ๋ผ ์žˆ๋Š”๋ฐ ๋™์ž‘์ด ๋ธ”๋ก ๋˜๋ ค ํ•œ๋‹ค.
EINVAL
fd_in์ด๋‚˜ fd_out์ด ํŒŒ์ดํ”„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ๋˜๋Š” fd_in๊ณผ fd_out์ด ๊ฐ™์€ ํŒŒ์ดํ”„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.
ENOMEM
๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ.

VERSIONS

๋ฆฌ๋ˆ…์Šค 2.6.17์—์„œ tee() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค. glibc ๋ฒ„์ „ 2.5์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

CONFORMING TO

์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

NOTES

๊ฐœ๋…์ ์œผ๋กœ tee()๋Š” ๋‘ ํŒŒ์ดํ”„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋„ ์ด๋ค„์ง€์ง€ ์•Š๋Š”๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ tee()๋Š” ์ž…๋ ฅ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒ ์žก๊ณ ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ ์ชฝ์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ์˜ˆ์—์„œ๋Š” 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);
}

SEE ALSO

splice(2), vmsplice(2), pipe(7)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ