sendfile(2) FreeBSD 一般コマンドマニュアル

sendfile

前のページ 上に戻る 次のページ

sendfile




書式

     #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 引数はファイルのどこから開始すべきかを指定します。 nbytes 引数は、
     ファイルの何バイトを送信する必要があるかを指定します。 0 は、ファイルの終
     わりまで送信するという特殊な意味を持ちます。

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

           struct sf_hdtr {
                   struct iovec *headers;  /* ヘッダ iovecs を指すポインタ */
                   int hdr_cnt;            /* ヘッダ iovecs の数 */
                   struct iovec *trailers; /* トレーラ iovecs を指すポインタ */
                   int  trl_cnt;           /* トレーラ iovecs の数 */
           };

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

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

     flags 引数は現時点では未定義であり、0 に指定する必要があります。

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


実装上の注釈

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

     非スレッドライブラリでは、 sendfile() は sendfile システムコールとして実
     装されています。

     スレッドライブラリでは、 sendfile システムコールは _thread_sys_sendfile()
     [ENOTSOCK]         s がソケットではありません。

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

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

     [EINVAL]           offset が負であるか、または範囲外です。

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

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

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

     [EFAULT]           パラメータについて無効なアドレスが指定されました。

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


関連項目

     open(2), send(2), socket(2), writev(2)


歴史

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


作者

     sendfile() とこのマニュアルページは David Greenman <dg@root.com> が作成し
     ました。

FreeBSD 4.4                    November 5, 1998                    FreeBSD 4.4

ABELNET VPSサービス