Manpages

名 前

sendfile − フ ァ イ ル デ ィ ス ク リ プ タ ー 間 で デ ー タ を 転 送 す る

書 式

#include <sys/sendfile.h>

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

説 明

sendfile() は 、 あ る フ ァ イ ル デ ィ ス ク リ プ タ ー か ら 別 の フ ァ イ ル デ ィ ス ク リ プ タ ー へ の デ ー タ の コ ピ ー を 行 う 。 こ の コ ピ ー は カ ー ネ ル 内 で 行 わ れ る の で 、 sendfile() は 、 read(2)write(2) を 組 み 合 わ せ る よ り も 効 率 が よ い 。 read(2)write(2) で は ユ ー ザ ー 空 間 と の 間 で デ ー タ の 転 送 が 必 要 と な る か ら で あ る 。

in_fd は 読 み 込 み の た め に オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー 、 out_fd は 書 き 込 み の た め に オ ー プ ン さ れ た デ ィ ス ク リ プ タ ー で な け れ ば な ら な い 。

offset が NULL で な い 場 合 、 offsetsendfile() が in_fd の ど こ か ら デ ー タ を 読 み 始 め る か を 示 す フ ァ イ ル オ フ セ ッ ト を 保 持 す る 変 数 へ の ポ イ ン タ ー で あ る 。 sendfile() は 復 帰 す る 時 、 こ の 変 数 に 最 後 に 読 み 込 ん だ バ イ ト の 次 の バ イ ト の オ フ セ ッ ト を 書 き 込 む 。 offset が NULL で な い 場 合 、 sendfile() は in_fd の フ ァ イ ル オ フ セ ッ ト の 現 在 値 を 変 更 し な い 。 NULL の 場 合 は 、 フ ァ イ ル オ フ セ ッ ト の 現 在 値 を in_fd か ら 読 み 込 ん だ バ イ ト 数 を 反 映 し た 位 置 に 調 整 す る 。

offset が NULL の 場 合 、 デ ー タ は in_fd の 現 在 の フ ァ イ ル オ フ セ ッ ト か ら 読 み 出 さ れ 、 フ ァ イ ル オ フ セ ッ ト は こ の 呼 び 出 し で 更 新 さ れ る 。

count は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー 間 で コ ピ ー す る バ イ ト 数 で あ る 。

in_fd 引 き 数 は mmap(2) 風 の 操 作 が で き る フ ァ イ ル を 指 し て い な け れ ば な ら な い (ソ ケ ッ ト を 指 定 す る こ と は で き な い )。

2.6.33 よ り 前 の Linux カ ー ネ ル で は out_fd は ソ ケ ッ ト を 参 照 し て い な け れ ば な ら な い 。 Linux 2.6.33 以 降 で は 、 任 意 の フ ァ イ ル を 参 照 す る こ と が で き る 。 通 常 の フ ァ イ ル の 場 合 に は sendfile() は フ ァ イ ル オ フ セ ッ ト を 適 切 に 変 更 す る 。

返 り 値

転 送 に 成 功 し た 場 合 、 out_fd に 書 き 込 ま れ た バ イ ト 数 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に 適 切 な 値 を 設 定 す る 。

エ ラ ー

EAGAIN

O_NONBLOCK を 用 い て 非 ブ ロ ッ ク I/O が 選 択 さ れ た が 、 書 き 込 み が ブ ロ ッ ク さ れ た 。

EBADF

入 力 フ ァ イ ル が 読 み 込 み の た め に オ ー プ ン さ れ て い な い か 、 出 力 フ ァ イ ル が 書 き 込 み の た め に オ ー プ ン さ れ て い な い 。

EFAULT ア ド レ ス が お か し い 。

EINVAL デ ィ ス ク リ プ タ ー が 有 効 で な い か 、 ロ ッ ク さ れ て い る 。 も し く は

mmap(2) 風 の 操 作 が in_fd で は 利 用 で き な い 。

EIO

in_fd か ら 読 み 込 ん で い る う ち に 予 期 し な い エ ラ ー が 起 こ っ た 。

ENOMEM

in_fd か ら 読 み 込 む た め の 十 分 な メ モ リ ー が な い 。

バ ー ジ ョ ン

sendfile は Linux 2.2 の 新 し い 機 能 で あ る 。 イ ン ク ル ー ド フ ァ イ ル <sys/sendfile.h> は glibc 2.1 か ら 存 在 し て い る 。

準 拠

POSIX.1−2001 や 他 の 標 準 で は 規 定 さ れ て い な い 。 他 の UNIX シ ス テ ム で は 、 異 な っ た 方 式 や プ ロ ト タ イ プ で sendfile() を 実 装 し て い る 。 移 植 性 を 考 慮 し た プ ロ グ ラ ム で は 使 用 す べ き で は な い 。

注 意

sendfile() を 使 っ て TCP ソ ケ ッ ト に フ ァ イ ル を 送 ろ う と し て い て 、 フ ァ イ ル の 内 容 の 前 に ヘ ッ ダ ー デ ー タ を 付 け 加 え る 必 要 が あ る 場 合 は 、 パ ケ ッ ト 数 を 最 小 に し て 性 能 を 上 げ る た め に tcp(7) に 記 述 さ れ て い る TCP_CORK オ プ シ ョ ン を 使 う と い い だ ろ う 。

Linux 2.4 と そ れ 以 前 の バ ー ジ ョ ン で も 、 out_fd は 通 常 の フ ァ イ ル を 参 照 で き 、 sendfile() は そ の フ ァ イ ル の オ フ セ ッ ト の 現 在 値 を 変 更 し て い た 。 元 々 の Linux sendfile() シ ス テ ム コ ー ル は 大 き な フ ァ イ ル オ フ セ ッ ト を 扱 え る よ う に 設 計 さ れ て い な か っ た 。 そ の 結 果 、 Linux 2.4 で 、 ビ ッ ト 幅 の 大 き な offset 引 き 数 を 持 っ た sendfile64() が 追 加 さ れ た 。 glibc の sendfile() の ラ ッ パ ー 関 数 は カ ー ネ ル に よ る こ の 違 い を 吸 収 し て い る 。

sendfile() が EINVALENOSYS で 失 敗 す る よ う な 場 合 は 、 ア プ リ ケ ー シ ョ ン は read(2)/write(2) に 戻 す こ と を 考 え て も よ い か も し れ な い 。

Linux 固 有 の splice(2) シ ス テ ム コ ー ル は 、 任 意 の フ ァ イ ル 間 (例 え ば 、 ソ ケ ッ ト 同 士 ) で の デ ー タ 転 送 を サ ポ ー ト し て い る 。

関 連 項 目

mmap(2), open(2), socket(2), splice(2)

こ の 文 書 に つ い て

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