SENDFILE
Section: System Calls (2)
索引
jman
BSD mandoc
索引
名称
sendfile
- ファイルをソケットに送信
索引
ライブラリ
Lb libc
索引
書式
In sys/types.h
In sys/socket.h
In sys/uio.h
Ft int
Fo sendfile
Fa int fd int s off_t offset size_t nbytes
Fa struct sf_hdtr *hdtr off_t *sbytes int flags
Fc
索引
解説
Fn sendfile
システムコールは、記述子
Fa fd
によって指定された通常のファイルを、記述子
Fa s
によって指定されたストリームソケットから送信します。
Fa offset
引数はファイルのどこから開始すべきかを指定します。
Fa offset
がファイルの終りを超えていた場合は、システムは
次に説明されるように成功を返して、0 バイトを送信したと報告します。
Fa nbytes
引数は、ファイルの何バイトを送信する必要があるかを指定します。
0 は、ファイルの終わりまで送信するという特殊な意味を持ちます。
オプションのヘッダまたはトレーラ、またはその両方は、構造体 sf_hdtr を
指すポインタを指定することによってファイルの前と後で送信できます。
Vt struct sf_hdtr
の構造は次のとおりです:
struct sf_hdtr {
struct iovec *headers; /* ヘッダ iovecs を指すポインタ */
int hdr_cnt; /* ヘッダ iovecs の数 */
struct iovec *trailers; /* トレーラ iovecs を指すポインタ */
int trl_cnt; /* トレーラ iovecs の数 */
};
Fa headers
ポインタと
Fa trailers
ポインタは、
NULL
でない場合に
Vt struct iovec
構造体の配列を指します。
iovec 構造体の詳細については、
Fn writev
システムコールを参照してください。
これらの配列内の iovecs の数は、
Fa hdr_cnt
と
Fa trl_cnt
によって指定されます。
NULL
でない場合に、システムは、ソケット上に送信された合計バイト数を、
Fa sbytes
によって指された変数に書き込みます。
Fa flags
引数として利用できる値は 1 つです:
SF_NODISKIO
。
このフラグは、ディスク入出力でブロックされるであろうすべての
Fn sendfile
呼び出しに対して、代わりに
Er EBUSY
を返させます。
ブロックされる転送要求を 1 つの分離された入出力ワーカスレッドにすることで、
忙しいサーバには役に立つことがあります。
非ブロッキング入出力用に指定されたソケットを使用するときに、
Fn sendfile
は要求されたよりも少ないバイトを送信することがあります。
この場合、正常に書き込まれたバイト数が
Fa *sbytes
(指定されている場合) に返され、エラー
Er EAGAIN
が返されます。
索引
実装に関する注
Fn sendfile
の
Fx での実装は「0 コピー」です。
すなわち、ファイルデータのコピーが回避されるように最適化されています。
索引
チューニング
内部ではこのシステムコールは、クライアントへの送信ファイルデータを
取り扱うために、特別な
Fn sendfile
バッファ
(Vt struct sf_buf
)
を使用しています。
送信ソケットがブロックされていて、
利用可能な
Fn sendfile
バッファが十分でない場合には、
Fn sendfile
はブロックされ、
``sfbufa
''
の状態を報告します。
送信ソケットがブロックされておらず、利用可能な
Fn sendfile
バッファが十分でない場合には、
この呼び出しはブロックされ、呼び出しを終了する前に必要なバッファが
利用可能になるのを待ちます。
Vt sf_buf
の割り当てられた数は、
Fn sendfile
を介してクライアントにデータを送信するために使用される nmbclusters の数に、
比例しているべきです。
ブロッキングを避けるために適宜にチューンしましょう!
Fn sendfile
を広範囲に使用する忙しい装置が、
kern.ipc.nmbclusters
に展開されるこれらの値を増加させたくなるかもしれません
(詳細は
tuning(7)
を参照してください)。
利用可能な
Fn sendfile
バッファの数は、
loader.conf5
の中の
kern.ipc.nsfbufs
変数または
NSFBUFS
カーネルコンフィギュレーション調整のどちらかによって、ブート時に決定されます。
Fn sendfile
バッファの数は
kern.maxusers
に合わせて調整されます。
kern.ipc.nsfbufsused
および
kern.ipc.nsfbufspeak
の読み取り専用の
sysctl(8)
変数は現在とピークの
Fn sendfile
バッファの使用量をそれぞれ表します。
これらの値は
netstat -m
を通しても見ることができます。
索引
戻り値
Rv -std sendfile
索引
エラー
- Bq Er EBADF
-
Fa fd
引数が有効なファイル記述子ではありません。
- Bq Er EBADF
-
Fa s
引数が有効なソケット記述子ではありません。
- Bq Er EBUSY
-
完全な転送を完了するにはディスク入出力が必要となるため、中断されました。
部分的なデータは送られたかもしれません
(このエラーは
SF_NODISKIO
が指定されたときのみ起こります)。
- Bq Er ENOTSOCK
-
Fa s
引数がソケットではありません。
- Bq Er EINVAL
-
Fa fd
引数が通常のファイルではありません。
- Bq Er EINVAL
-
Fa s
引数が SOCK_STREAM 型のソケットではありません。
- Bq Er EINVAL
-
Fa offset
引数が負です。
- Bq Er ENOTCONN
-
Fa s
引数が、未接続のソケットを指しています。
- Bq Er EPIPE
-
通信相手が接続を閉じてしまいました。
- Bq Er EIO
-
Fa fd
から読取り中に入出力エラーが発生しました。
- Bq Er EFAULT
-
引数について無効なアドレスが指定されました。
- Bq Er EINTR
-
Fn sendfile
が完了する前にシグナルが割り込みました。
Fa *sbytes
が指定された場合には、成功裏に送出されたバイト数がここに格納されます。
- Bq Er EAGAIN
-
ソケットは非ブロッキング入出力と指定されており、ソケットバッファが
満杯であるためにすべてのデータが送信されませんでした。
sbytes が指定された場合、送信が正常に完了したバイト数が
Fa *sbytes
内に返されます。
索引
関連項目
netstat(1),
open(2),
send(2),
socket(2),
writev(2),
tuning(7)
索引
歴史
Fn sendfile
システムコールは、
Fx 3.0
ではじめて登場しました。
このマニュアルページは
Fx 3.1
ではじめて登場しました。
索引
作者
Fn sendfile
システムコールとこのマニュアルページは
An David G. Lawrence Aq dg@dglawrence.com
が作成しました。
索引
Index
- 名称
-
- ライブラリ
-
- 書式
-
- 解説
-
- 実装に関する注
-
- チューニング
-
- 戻り値
-
- エラー
-
- 関連項目
-
- 歴史
-
- 作者
-
Time: 07:06:30 GMT, January 12, 2009