スポンサーリンク

SENDFILE(2) FreeBSD システムコールマニュアル SENDFILE(2)

名称

sendfile − ファイルをソケットに送信

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>

int

       sendfile(int fd, int s, off_t offset, size_t nbytes,struct sf_hdtr *hdtr, off_t *sbytes, int flags);

解説

sendfile() システムコールは、記述子 fd によって指定された通常のファイル を、記述子 s によって指定されたストリームソケットから送信します。

offset 引数はファイルのどこから開始すべきかを指定します。 offset がファイ ルの終りを超えていた場合は、システムは次に説明されるように成功を返して、0 バイトを送信したと報告します。 nbytes 引数は、ファイルの何バイトを送信す る必要があるかを指定します。 0 は、ファイルの終わりまで送信するという特殊 な意味を持ちます。

オプションのヘッダまたはトレーラ、またはその両方は、構造体 sf_hdtr を指す ポインタを指定することによってファイルの前と後で送信できます。 struct sf_hdtr の構造は次のとおりです:

      struct sf_hdtr {

struct iovec *headers; /* ヘッダ iovecs を指すポインタ */

int hdr_cnt; /* ヘッダ iovecs の数 */

struct iovec *trailers; /* トレーラ iovecs を指すポインタ */

int trl_cnt; /* トレーラ iovecs の数 */

};

headers ポインタと trailers ポインタは、 NULL でない場合に struct iovec 構造体の配列を指します。 iovec 構造体の詳細については、 writev() システム コールを参照してください。これらの配列内の iovecs の数は、 hdr_cnttrl_cnt によって指定されます。

NULL でない場合に、システムは、ソケット上に送信された合計バイト数を、 sbytes によって指された変数に書き込みます。

flags 引数として利用できる値は 1 つです: SF_NODISKIO 。このフラグは、ディ スク入出力でブロックされるであろうすべての sendfile() 呼び出しに対して、 代わりに EBUSY を返させます。ブロックされる転送要求を 1 つの分離された入 出力ワーカスレッドにすることで、忙しいサーバには役に立つことがあります。

非ブロッキング入出力用に指定されたソケットを使用するときに、 sendfile() は要求されたよりも少ないバイトを送信することがあります。この場合、正常に 書き込まれたバイト数が *sbytes (指定されている場合) に返され、エラー EAGAIN が返されます。

実装に関する注

sendfile() の FreeBSD での実装は「0 コピー」です。すなわち、ファイルデー タのコピーが回避されるように最適化されています。

チューニング

内部ではこのシステムコールは、クライアントへの送信ファイルデータを取り扱 うために、特別な sendfile() バッファ (struct sf_buf) を使用しています。送 信ソケットがブロックされていて、利用可能な sendfile() バッファが十分でな い場合には、 sendfile() はブロックされ、 ‘‘sfbufa’’ の状態を報告します。 送信ソケットがブロックされておらず、利用可能な sendfile() バッファが十分 でない場合には、この呼び出しはブロックされ、呼び出しを終了する前に必要な バッファが利用可能になるのを待ちます。

sf_buf の割り当てられた数は、 sendfile() を介してクライアントにデータを送 信するために使用される nmbclusters の数に、比例しているべきです。ブロッキ ングを避けるために適宜にチューンしましょう! sendfile() を広範囲に使用す る忙しい装置が、 kern.ipc.nmbclusters に展開されるこれらの値を増加させた くなるかもしれません (詳細は tuning(7) を参照してください)。

利用可能な sendfile() バッファの数は、 loader.conf(5) の中の kern.ipc.nsfbufs 変数または NSFBUFS カーネルコンフィギュレーション調整の どちらかによって、ブート時に決定されます。 sendfile() バッファの数は kern.maxusers に合わせて調整されます。 kern.ipc.nsfbufsused および kern.ipc.nsfbufspeak の読み取り専用の sysctl(8) 変数は現在とピークの sendfile() バッファの使用量をそれぞれ表します。これらの値は netstat −m を 通しても見ることができます。

戻り値

関数 sendfile() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

       [EBADF]

fd 引数が有効なファイル記述子ではありません。

[EBADF]
s
引数が有効なソケット記述子ではありません。

[EBUSY]
完全な転送を完了するにはディスク入出力が必要となるた め、中断されました。部分的なデータは送られたかもしれま せん (このエラーは SF_NODISKIO が指定されたときのみ起 こります)。

[ENOTSOCK]
s
引数がソケットではありません。

[EINVAL]
fd
引数が通常のファイルではありません。

[EINVAL]
s
引数が SOCK_STREAM 型のソケットではありません。

[EINVAL]
offset
引数が負です。

[ENOTCONN]
s
引数が、未接続のソケットを指しています。

[EPIPE]
通信相手が接続を閉じてしまいました。

[EIO]
fd
から読取り中に入出力エラーが発生しました。

[EFAULT]
引数について無効なアドレスが指定されました。

[EINTR]
sendfile
() が完了する前にシグナルが割り込みました。 *sbytes が指定された場合には、成功裏に送出されたバイト 数がここに格納されます。

[EAGAIN]
ソケットは非ブロッキング入出力と指定されており、ソケッ トバッファが満杯であるためにすべてのデータが送信されま せんでした。 sbytes が指定された場合、送信が正常に完了 したバイト数が *sbytes 内に返されます。

関連項目

netstat(1), open(2), send(2), socket(2), writev(2), tuning(7)

歴史

sendfile() システムコールは、 FreeBSD 3.0 ではじめて登場しました。このマ ニュアルページは FreeBSD 3.1 ではじめて登場しました。

作者

sendfile() システムコールとこのマニュアルページは David G. Lawrence ⟨dg@dglawrence.com⟩ が作成しました。

FreeBSD 10.0 October 16, 2004 FreeBSD 10.0

スポンサーリンク