SENDFILE
Section: Linux Programmer's Manual (2)
Updated: 2004-12-17
Index
JM Home Page
roff page
名前
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
から読み込んだバイト数を反映した位置に調整する。
count
は、ファイル・ディスクリプタ間でコピーするバイト数である。
今のところ (Linux 2.6.9 では)、
in_fd
は
mmap(2)
風の操作ができるファイルを指していなければならない
(ソケットを指してはならない)。また、
out_fd
はソケットを指していなければならない。
sendfile()
が
EINVAL
や
ENOSYS
で失敗するような場合は、
アプリケーションは
read(2)/write(2)
に戻すことを考えてもよいかもしれない。
返り値
転送に成功した場合、
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()
はそのファイルのオフセットの現在値を変更していた。
関連項目
open(2),
mmap(2),
socket(2),
splice(2)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- バージョン
-
- 準拠
-
- 注意
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:32:01 GMT, November 19, 2007