Man page - sendfile64(2)

Packages contains this manual

Available languages:

en fr pl ja ru ro

Manual

SENDFILE

名 前
書 式
説 明
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
関 連 項 目
こ の 文 書 に つ い て

名 前

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 () は フ ァ イ ル オ フ セ ッ ト を 適 切 に 変 更 す る 。

返 り 値

If the transfer was successful, the number of bytes written to out_fd is returned. Note that a successful call to sendfile () may write fewer bytes than requested; the caller should be prepared to retry the call if there were unsent bytes. See also NOTES.

エ ラ ー の 場 合 は -1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。

エ ラ ー

EAGAIN

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

EBADF

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

EFAULT

ア ド レ ス が お か し い 。

EINVAL

デ ィ ス ク リ プ タ ー が 有 効 で な い か 、 ロ ッ ク さ れ て い る 。 も し く は mmap (2) 風 の 操 作 が in_fd で は 利 用 で き な い 。 も し く は count が 負 で あ る 。

EINVAL

out_fd has the O_APPEND flag set. This is not currently supported by sendfile ().

EIO

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

ENOMEM

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

EOVERFLOW

count is too large, the operation would result in exceeding the maximum size of either the input file or the output file.

ESPIPE

offset is not NULL but the input file is not seekable.

バ ー ジ ョ ン

sendfile は Linux 2.2 で 初 め て 登 場 し た 。 イ ン ク ル ー ド フ ァ イ ル <sys/sendfile.h> は glibc 2.1 か ら 存 在 し て い る 。

準 拠

POSIX.1-2001 や 他 の 標 準 で は 規 定 さ れ て い な い 。

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

注 意

sendfile () will transfer at most 0x7ffff000 (2,147,479,552) bytes, returning the number of bytes actually transferred. (This is true on both 32-bit and 64-bit systems.)

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

In Linux 2.4 and earlier, out_fd could also refer to a regular file; this possibility went away in the Linux 2.6.x kernel series, but was restored in Linux 2.6.33.

元 々 の Linux sendfile () シ ス テ ム コ ー ル は 大 き な フ ァ イ ル オ フ セ ッ ト を 扱 え る よ う に 設 計 さ れ て い な か っ た 。 そ の 結 果 、 Linux 2.4 で 、 ビ ッ ト 幅 の 大 き な offset 引 数 を 持 っ た sendfile64 () が 追 加 さ れ た 。 glibc の sendfile () の ラ ッ パ ー 関 数 は カ ー ネ ル に よ る こ の 違 い を 吸 収 し て い る 。

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

If out_fd refers to a socket or pipe with zero-copy support, callers must ensure the transferred portions of the file referred to by in_fd remain unmodified until the reader on the other end of out_fd has consumed the transferred data.

The Linux-specific splice (2) call supports transferring data between arbitrary file descriptors provided one (or both) of them is a pipe.

関 連 項 目

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

こ の 文 書 に つ い て

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