Man page - tee(2)

Packages contains this manual

Available languages:

en fr pl ja ru ro

Manual

TEE

名 前
書 式
説 明
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意

プ ロ グ ラ ム の ソ ー ス
関 連 項 目
こ の 文 書 に つ い て

名 前

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 is a bit mask that is composed by ORing together zero or more of the following values:

SPLICE_F_MOVE

現 在 の と こ ろ tee () で は 何 の 効 果 も な い 。 splice (2) 参 照 。

SPLICE_F_NONBLOCK

入 出 力 で 停 止 (block) し な い 。 詳 細 は splice (2) 参 照 。

SPLICE_F_MORE

現 在 の と こ ろ tee () で は 何 の 効 果 も な い が 、 将 来 的 に は 実 装 さ れ る 可 能 性 が あ る 。 splice (2) 参 照 。

SPLICE_F_GIFT

tee () で は 未 使 用 。 vmsplice (2) 参 照 。

返 り 値

成 功 し て 完 了 す る と 、 tee () は 入 出 力 間 で 複 製 さ れ た バ イ ト 数 を 返 す 。 返 り 値 0 は デ ー タ の 転 送 が 行 わ れ な か っ た こ と を 示 す 。 こ の 場 合 、 処 理 を 停 止 (block) し て も 無 意 味 で あ る 。 な ぜ な ら 、 fd_in が 参 照 す る パ イ プ の 書 き 込 み 側 に 接 続 さ れ て い る 者 が い な い か ら で あ る 。

エ ラ ー の 場 合 、 tee () は -1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。

エ ラ ー

EAGAIN

SPLICE_F_NONBLOCK was specified in flags or one of the file descriptors had been marked as nonblocking ( O_NONBLOCK ) , and the operation would block.

EINVAL

fd_in fd_out の ど ち ら か が パ イ プ を 参 照 し て い な い 。 も し く は fd_in fd_out が 同 じ パ イ プ を 参 照 し て い る 。

ENOMEM

メ モ リ ー 不 足 。

バ ー ジ ョ ン

tee () シ ス テ ム コ ー ル は Linux 2.6.17 で 初 め て 登 場 し た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.5 で 追 加 さ れ た 。

準 拠

こ の シ ス テ ム コ ー ル は Linux 固 有 で あ る 。

注 意

概 念 と し て は 、 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 {
/*
* tee stdin to 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;

/*
* Consume stdin by splicing it to a file.
*/
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)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。