名 前
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 で な い 場 合 、 offset は sendfile() が 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() が EINVAL や ENOSYS で 失 敗 す る よ う な 場 合 は 、 ア プ リ ケ ー シ ョ ン は 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/ に 書 か れ て い る 。