.\"
.\" 2005-03-31 Martin Pool <mbp@sourcefrog.net> mmap() improvements
.\"
-.\" Japanese Version Copyright (c) 1999 HANATAKA Shinya
-.\" all rights reserved.
-.\" Translated 1999-06-26, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
-.\" Updated 2001-02-16, Kentaro Shirakata <argrath@ub32.org>
-.\" Updated 2003-09-08, Kentaro Shirakata <argrath@ub32.org>
-.\" Updated 2005-03-14, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
-.\" Updated 2005-04-17, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
-.\" Updated 2010-04-18, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.24
+.\"*******************************************************************
.\"
-.\"WORD: descriptor ¥Ç¥£¥¹¥¯¥ê¥×¥¿
-.\"WORD: socket ¥½¥±¥Ã¥È
-.\"WORD: lock ¥í¥Ã¥¯
+.\" This file was generated with po4a. Translate the source file.
.\"
-.TH SENDFILE 2 2010-02-15 "Linux" "Linux Programmer's Manual"
-.SH ̾Á°
-sendfile \- ¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥¹¥¯¥ê¥×¥¿´Ö¤Ç¥Ç¡¼¥¿¤òžÁ÷¤¹¤ë
-.SH ½ñ¼°
-.B #include <sys/sendfile.h>
+.\"*******************************************************************
+.TH SENDFILE 2 2011\-09\-14 Linux "Linux Programmer's Manual"
+.SH 名前
+sendfile \- ファイル・ディスクリプタ間でデータを転送する
+.SH 書式
+\fB#include <sys/sendfile.h>\fP
.sp
-.BI "ssize_t sendfile(int" " out_fd" ", int" " in_fd" ", off_t *" \
- offset ", size_t" " count" );
-.\" °Ê²¼¤Ï¡¢¤¢¤Þ¤ê¤Ë¤â±ø¤¤¡£ glibc ¥Ð¡¼¥¸¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Î¥³¥á¥ó¥È¤Ï
-.\" ¡Ö¥Ø¥Ã¥À¡×¤Ç¤Ï¤Ê¤¯¡¢¡ÖÃí°Õ¡×¤Ë½ñ¤¤¤Æ¤ª¤¯¡£
+.\" The below is too ugly. Comments about glibc versions belong
+.\" in the notes, not in the header.
.\"
.\" .B #include <features.h>
.\" .br
.\" .br
.\" .B #endif
.\"
-.SH ÀâÌÀ
-.BR sendfile ()
-¤Ï¡¢¤¢¤ë¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥¹¥¯¥ê¥×¥¿¤«¤éÊ̤Î
-¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ø¤Î¥Ç¡¼¥¿¤Î¥³¥Ô¡¼¤ò¹Ô¤¦¡£
-¤³¤Î¥³¥Ô¡¼¤Ï¥«¡¼¥Í¥ëÆâ¤Ç¹Ô¤ï¤ì¤ë¤Î¤Ç¡¢
-.BR sendfile ()
-¤Ï¡¢
-.BR read (2)
-¤È
-.BR write (2)
-¤òÁȤ߹ç¤ï¤»¤ë¤è¤ê¤â¸úΨ¤¬¤è¤¤¡£
-.BR read (2)
-¤ä
-.BR write (2)
-¤Ç¤Ï¥æ¡¼¥¶¶õ´Ö¤È¤Î´Ö¤Ç¥Ç¡¼¥¿¤ÎžÁ÷¤¬É¬ÍפȤʤ뤫¤é¤Ç¤¢¤ë¡£
+\fBssize_t sendfile(int\fP\fI out_fd\fP\fB, int\fP\fI in_fd\fP\fB, off_t *\fP\fIoffset\fP\fB,
+size_t\fP\fI count\fP\fB);\fP
+.SH 説明
+\fBsendfile\fP() は、あるファイル・ディスクリプタから別の ファイル・ディスクリプタへのデータのコピーを行う。
+このコピーはカーネル内で行われるので、 \fBsendfile\fP() は、 \fBread\fP(2) と \fBwrite\fP(2)
+を組み合わせるよりも効率がよい。 \fBread\fP(2) や \fBwrite\fP(2) ではユーザ空間との間でデータの転送が必要となるからである。
-.I in_fd
-¤ÏÆɤ߹þ¤ß¤Î¤¿¤á¤Ë¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥¹¥¯¥ê¥×¥¿¡¢
-.I out_fd
-¤Ï½ñ¤¹þ¤ß¤Î¤¿¤á¤Ë¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+\fIin_fd\fP は読み込みのためにオープンされたファイル・ディスクリプタ、 \fIout_fd\fP
+は書き込みのためにオープンされたディスクリプタでなければならない。
-.I offset
-¤¬ NULL ¤Ç¤Ê¤¤¾ì¹ç¡¢
-.I offset
-¤Ï
-.BR sendfile ()
-¤¬
-.I in_fd
-¤Î¤É¤³¤«¤é¥Ç¡¼¥¿¤òÆɤ߻Ϥá¤ë¤«¤ò¼¨¤¹¥Õ¥¡¥¤¥ë¡¦¥ª¥Õ¥»¥Ã¥È¤òÊÝ»ý¤¹¤ëÊÑ¿ô¤Ø¤Î
-¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
-.BR sendfile ()
-¤ÏÉüµ¢¤¹¤ë»þ¡¢¤³¤ÎÊÑ¿ô¤ËºÇ¸å¤ËÆɤ߹þ¤ó¤À¥Ð¥¤¥È¤Î
-¼¡¤Î¥Ð¥¤¥È¤Î¥ª¥Õ¥»¥Ã¥È¤ò½ñ¤¹þ¤à¡£
-.I offset
-¤¬ NULL ¤Ç¤Ê¤¤¾ì¹ç¡¢
-.BR sendfile ()
-¤Ï
-.I in_fd
-¤Î¥Õ¥¡¥¤¥ë¡¦¥ª¥Õ¥»¥Ã¥È¤Î¸½ºßÃͤòÊѹ¹¤·¤Ê¤¤¡£
-NULL ¤Î¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥ª¥Õ¥»¥Ã¥È¤Î¸½ºßÃͤò
-.I in_fd
-¤«¤éÆɤ߹þ¤ó¤À¥Ð¥¤¥È¿ô¤òÈ¿±Ç¤·¤¿°ÌÃÖ¤ËÄ´À°¤¹¤ë¡£
+\fIoffset\fP が NULL でない場合、 \fIoffset\fP は \fBsendfile\fP() が \fIin_fd\fP
+のどこからデータを読み始めるかを示すファイル・オフセットを保持する変数への ポインタである。 \fBsendfile\fP()
+は復帰する時、この変数に最後に読み込んだバイトの 次のバイトのオフセットを書き込む。 \fIoffset\fP が NULL でない場合、
+\fBsendfile\fP() は \fIin_fd\fP のファイル・オフセットの現在値を変更しない。 NULL の場合は、ファイル・オフセットの現在値を
+\fIin_fd\fP から読み込んだバイト数を反映した位置に調整する。
-.I offset
-¤¬ NULL ¤Î¾ì¹ç¡¢¥Ç¡¼¥¿¤Ï
-.I in_fd
-¤Î¸½ºß¤Î¥Õ¥¡¥¤¥ë¡¦¥ª¥Õ¥»¥Ã¥È¤«¤éÆɤ߽Фµ¤ì¡¢
-¥Õ¥¡¥¤¥ë¡¦¥ª¥Õ¥»¥Ã¥È¤Ï¤³¤Î¸Æ¤Ó½Ð¤·¤Ç¹¹¿·¤µ¤ì¤ë¡£
+\fIoffset\fP が NULL の場合、データは \fIin_fd\fP の現在のファイル・オフセットから読み出され、
+ファイル・オフセットはこの呼び出しで更新される。
-.I count
-¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥¹¥¯¥ê¥×¥¿´Ö¤Ç¥³¥Ô¡¼¤¹¤ë¥Ð¥¤¥È¿ô¤Ç¤¢¤ë¡£
+\fIcount\fP は、ファイル・ディスクリプタ間でコピーするバイト数である。
-º£¤Î¤È¤³¤í (Linux 2.6.9 ¤Ç¤Ï)¡¢
-.I in_fd
-¤Ï
-.BR mmap (2)
-É÷¤ÎÁàºî¤¬¤Ç¤¤ë¥Õ¥¡¥¤¥ë¤ò»Ø¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
-(¥½¥±¥Ã¥È¤ò»Ø¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤)¡£¤Þ¤¿¡¢
-.I out_fd
-¤Ï¥½¥±¥Ã¥È¤ò»Ø¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+\fIin_fd\fP 引き数は \fBmmap\fP(2) 風の操作ができるファイルを指していなければならな
+い (ソケットを指定することはできない)。
-.BR sendfile ()
-¤¬
-.B EINVAL
-¤ä
-.B ENOSYS
-¤Ç¼ºÇÔ¤¹¤ë¤è¤¦¤Ê¾ì¹ç¤Ï¡¢
-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï
-.BR read (2)/ write (2)
-¤ËÌ᤹¤³¤È¤ò¹Í¤¨¤Æ¤â¤è¤¤¤«¤â¤·¤ì¤Ê¤¤¡£
-.SH ÊÖ¤êÃÍ
-žÁ÷¤ËÀ®¸ù¤·¤¿¾ì¹ç¡¢
-.I out_fd
-¤Ë½ñ¤¹þ¤Þ¤ì¤¿¥Ð¥¤¥È¿ô¤òÊÖ¤¹¡£¥¨¥é¡¼¤Î¾ì¹ç¡¢\-1 ¤òÊÖ¤·¡¢
-.I errno
-¤ËŬÀÚ¤ÊÃͤòÀßÄꤹ¤ë¡£
-.SH ¥¨¥é¡¼
-.TP
-.B EAGAIN
-.B O_NONBLOCK
-¤òÍѤ¤¤ÆÈó¥Ö¥í¥Ã¥¯ I/O ¤¬ÁªÂò¤µ¤ì¤¿¤¬¡¢½ñ¤¹þ¤ß¤¬¥Ö¥í¥Ã¥¯¤µ¤ì¤¿¡£
-.TP
-.B EBADF
-ÆþÎÏ¥Õ¥¡¥¤¥ë¤¬Æɤ߹þ¤ß¤Î¤¿¤á¤Ë¥ª¡¼¥×¥ó¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¡¢
-½ÐÎÏ¥Õ¥¡¥¤¥ë¤¬½ñ¤¹þ¤ß¤Î¤¿¤á¤Ë¥ª¡¼¥×¥ó¤µ¤ì¤Æ¤¤¤Ê¤¤¡£
-.TP
-.B EFAULT
-¥¢¥É¥ì¥¹¤¬¤ª¤«¤·¤¤¡£
-.TP
-.B EINVAL
-¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬Í¸ú¤Ç¤Ê¤¤¤«¡¢¥í¥Ã¥¯¤µ¤ì¤Æ¤¤¤ë¡£¤â¤·¤¯¤Ï
-.BR mmap (2)
-É÷¤ÎÁàºî¤¬
-.I in_fd
-¤Ç¤ÏÍøÍѤǤ¤Ê¤¤¡£
-.TP
-.B EIO
-.I in_fd
-¤«¤éÆɤ߹þ¤ó¤Ç¤¤¤ë¤¦¤Á¤Ëͽ´ü¤·¤Ê¤¤¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿¡£
-.TP
-.B ENOMEM
-.I in_fd
-¤«¤éÆɤ߹þ¤à¤¿¤á¤Î½½Ê¬¤Ê¥á¥â¥ê¤¬¤Ê¤¤¡£
-.SH ¥Ð¡¼¥¸¥ç¥ó
-.B sendfile
-¤Ï Linux 2.2 ¤Î¿·¤·¤¤µ¡Ç½¤Ç¤¢¤ë¡£
-¥¤¥ó¥¯¥ë¡¼¥É¥Õ¥¡¥¤¥ë
-.I <sys/sendfile.h>
-¤Ï glibc 2.1 ¤«¤é¸ºß¤·¤Æ¤¤¤ë¡£
-.SH ½àµò
-POSIX.1-2001 ¤ä¾¤Îɸ½à¤Ç¤Ïµ¬Äꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
+2.6.33 より前の Linux カーネルでは \fIout_fd\fP はソケットを参照していなければな
+らない。Linux 2.6.33 以降では、任意のファイルを参照することができる。
+通常のファイルの場合には \fBsendfile\fP() はファイルオフセットを適切に変更する。
+.SH 返り値
+転送に成功した場合、 \fIout_fd\fP に書き込まれたバイト数を返す。エラーの場合、\-1 を返し、 \fIerrno\fP に適切な値を設定する。
+.SH エラー
+.TP
+\fBEAGAIN\fP
+\fBO_NONBLOCK\fP を用いて非ブロック I/O が選択されたが、書き込みがブロックされた。
+.TP
+\fBEBADF\fP
+入力ファイルが読み込みのためにオープンされていないか、 出力ファイルが書き込みのためにオープンされていない。
+.TP
+\fBEFAULT\fP
+アドレスがおかしい。
+.TP
+\fBEINVAL\fP
+ディスクリプタが有効でないか、ロックされている。もしくは \fBmmap\fP(2) 風の操作が \fIin_fd\fP では利用できない。
+.TP
+\fBEIO\fP
+\fIin_fd\fP から読み込んでいるうちに予期しないエラーが起こった。
+.TP
+\fBENOMEM\fP
+\fIin_fd\fP から読み込むための十分なメモリがない。
+.SH バージョン
+\fBsendfile\fP は Linux 2.2 の新しい機能である。 インクルードファイル \fI<sys/sendfile.h>\fP は
+glibc 2.1 から存在している。
+.SH 準拠
+POSIX.1\-2001 や他の標準では規定されていない。
-¾¤Î UNIX ¥·¥¹¥Æ¥à¤Ç¤Ï¡¢°Û¤Ê¤Ã¤¿Êý¼°¤ä¥×¥í¥È¥¿¥¤¥×¤Ç
-.BR sendfile ()
-¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¡£°Ü¿¢À¤ò¹Íθ¤·¤¿¥×¥í¥°¥é¥à¤Ç¤Ï»ÈÍѤ¹¤Ù¤¤Ç¤Ï¤Ê¤¤¡£
-.SH Ãí°Õ
-.BR sendfile ()
-¤ò»È¤Ã¤Æ TCP ¥½¥±¥Ã¥È¤Ë¥Õ¥¡¥¤¥ë¤òÁ÷¤í¤¦¤È¤·¤Æ¤¤¤Æ¡¢
-¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÎÁ°¤Ë¥Ø¥Ã¥À¡¦¥Ç¡¼¥¿¤òÉÕ¤±²Ã¤¨¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢
-¥Ñ¥±¥Ã¥È¿ô¤òºÇ¾®¤Ë¤·¤ÆÀǽ¤ò¾å¤²¤ë¤¿¤á¤Ë
-.BR tcp (7)
-¤Ëµ½Ò¤µ¤ì¤Æ¤¤¤ë
-.B TCP_CORK
-¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤È¤¤¤¤¤À¤í¤¦¡£
+他の UNIX システムでは、異なった方式やプロトタイプで \fBsendfile\fP()
+を実装している。移植性を考慮したプログラムでは使用すべきではない。
+.SH 注意
+\fBsendfile\fP() を使って TCP ソケットにファイルを送ろうとしていて、 ファイルの内容の前にヘッダ・データを付け加える必要がある場合は、
+パケット数を最小にして性能を上げるために \fBtcp\fP(7) に記述されている \fBTCP_CORK\fP オプションを使うといいだろう。
+
+Linux 2.4 とそれ以前のバージョンでも、 \fIout_fd\fP は通常のファイルを参照でき、
+\fBsendfile\fP() はそのファイルのオフセットの現在値を変更していた。
+
+元々の Linux \fBsendfile\fP() システムコールは大きなファイルオフセットを
+扱えるように設計されていなかった。その結果、Linux 2.4 で、
+ビット幅の大きな \fIoffset\fP 引き数を持った \fBsendfile64\fP() が追加された。
+glibc の \fBsendfile\fP() のラッパー関数はカーネルによるこの違いを吸収している。
+
+\fBsendfile\fP() が \fBEINVAL\fP や \fBENOSYS\fP で失敗するような場合は、 アプリケーションは
+\fBread\fP(2)/\fBwrite\fP(2) に戻すことを考えてもよいかもしれない。
+
+Linux 固有の \fBsplice\fP(2) システムコールは、任意のファイル間 (例えば、
+ソケット同士) でのデータ転送をサポートしている。
+.SH 関連項目
+\fBmmap\fP(2), \fBopen\fP(2), \fBsocket\fP(2), \fBsplice\fP(2)
-Linux 2.4 ¤È¤½¤ì°ÊÁ°¤Î¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ï¡¢
-.I out_fd
-¤ÏÄ̾ï¤Î¥Õ¥¡¥¤¥ë¤ò»²¾È¤Ç¤¡¢
-.BR sendfile ()
-¤Ï¤½¤Î¥Õ¥¡¥¤¥ë¤Î¥ª¥Õ¥»¥Ã¥È¤Î¸½ºßÃͤòÊѹ¹¤·¤Æ¤¤¤¿¡£
-.SH ´ØÏ¢¹àÌÜ
-.BR mmap (2),
-.BR open (2),
-.BR socket (2),
-.BR splice (2)