kazmax - Linux で自宅サーバー

sendfile - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 注意
  5. 返り値
  6. エラー
  7. バージョン
  8. 準拠
  9. 関連項目

名前

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 から読み込んだバイト数を反映した位置に調整する。
count は、ファイル・ディスクリプタ間でコピーするバイト数である。
今のところ (Linux 2.6.9 では)、 in_fdmmap ()風の操作ができるファイルを指していなければならない (ソケットを指してはならない)。また、 out_fd はソケットを指していなければならない。
sendfile ()が EINVAL や ENOSYS で失敗するような場合は、 アプリケーションは read (2)/ write (2)に戻すことを考えてもよいかもしれない。

注意

sendfile ()を使って TCP ソケットにファイルを送ろうとしていて、 ファイルの内容の前にヘッダ・データを付け加える必要がある場合は、 パケット数を最小にして性能を上げるために   tcp (7) に記述されている TCP_CORK オプションを使うといいだろう。
Linux 2.4 とそれ以前のバージョンでは、 out_fd は通常のファイルを参照でき、 sendfile ()はそのファイルのオフセットの現在値を変更していた。

返り値

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

エラー

EAGAIN
O_NONBLOCK を用いて非ブロック I/O が選択されたが、書き込みがブロックされた。
EBADF
入力ファイルが読み込みのためにオープンされていないか、 出力ファイルが書き込みのためにオープンされていない。
EFAULT
アドレスがおかしい。
EINVAL
ディスクリプタが有効でないか、ロックされている。もしくは mmap ()風の操作が in_fd では利用できない。
EIO
in_fd から読み込んでいるうちに予期しないエラーが起こった。
ENOMEM
in_fd から読み込むための十分なメモリがない。

バージョン

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

準拠

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

関連項目