Manpages

名 前

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 は 一 連 の 修 飾 フ ラ グ で あ り 、 splice(2)vmsplice(2) と 共 通 の 名 前 で あ る 。

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_NONBLOCKflags に 指 定 さ れ て い て 、 か つ 操 作 が 停 止 す る よ う な 状 態 で あ っ た 。

EINVAL

fd_infd_out の ど ち ら か が パ イ プ を 参 照 し て い な い 。 も し く は fd_infd_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)

こ の 文 書 に つ い て

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