Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all 

名前
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.54 の一部 である。プロジェクトの説明とバグ報告
に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
Linux 2011-09-14 SENDFILE(2)