OSDN Git Service

Convert release and draft pages to UTF-8.
[linuxjm/jm.git] / manual / LDP_man-pages / release / man2 / splice.2
index a92cb1b..3822de8 100644 (file)
 .\" Updated 2008-11-10, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.13
 .\" 
 .TH SPLICE 2 2009-09-15 "Linux" "Linux Programmer's Manual"
-.SH Ì¾Á°
-splice \- ¥Ñ¥¤¥×¤È¤Î´Ö¤Ç¥Ç¡¼¥¿¤ò·Ñ¤®¹ç¤ï¤»¤ë
-.SH ½ñ¼°
+.SH 名前
+splice \- パイプとの間でデータを継ぎ合わせる
+.SH 書式
 .nf
-.BR "#define _GNU_SOURCE" "         /* feature_test_macros(7) »²¾È */"
+.BR "#define _GNU_SOURCE" "         /* feature_test_macros(7) 参照 */"
 .B #include <fcntl.h>
 
 .BI "ssize_t splice(int " fd_in ", loff_t *" off_in ", int " fd_out ,
@@ -41,164 +41,164 @@ splice \- 
 ", unsigned int " flags );
 .fi
 .\" Return type was long before glibc 2.7
-.SH ÀâÌÀ
+.SH 説明
 .BR splice ()
-¤Ï¡¢¥«¡¼¥Í¥ë¥¢¥É¥ì¥¹¶õ´Ö¤È¥æ¡¼¥¶¥¢¥É¥ì¥¹¶õ´Ö¤È¤Î´Ö¤Î¥³¥Ô¡¼¤òȼ¤ï¤º¤Ë¡¢
-2 ¤Ä¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿´Ö¤Ç¥Ç¡¼¥¿¤Î°ÜÆ°¤ò¹Ô¤¦¡£
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿
+は、カーネルアドレス空間とユーザアドレス空間との間のコピーを伴わずに、
+2 つのファイルディスクリプタ間でデータの移動を行う。
+ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿
 .I fd_in
-¤«¤é¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿
+ã\81\8bã\82\89ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿
 .I fd_out
-¤ØºÇÂç
+へ最大
 .I len
-¥Ð¥¤¥È¤òžÁ÷¤¹¤ë¡£
-2 ¤Ä¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¤¦¤Á°ì¤Ä¤Ï
-¥Ñ¥¤¥×¤ò»²¾È¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+バイトを転送する。
+2 つのファイルディスクリプタのうち一つは
+パイプを参照していなければならない。
 .PP
 .I fd_in
-¤¬¥Ñ¥¤¥×¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¡¢
+がパイプを参照している場合、
 .I off_in
-¤Ï NULL ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+は NULL でなければならない。
 .I fd_in
-¤¬¥Ñ¥¤¥×¤ò»²¾È¤·¤Æ¤ª¤é¤º¡¢
+がパイプを参照しておらず、
 .I off_in
-¤¬ NULL ¤Î¾ì¹ç¡¢
+が NULL の場合、
 .I fd_in
-¤Î¸½ºß¤Î¥Õ¥¡¥¤¥ë¥ª¥Õ¥»¥Ã¥È¤«¤é»Ï¤Þ¤ë¥Ð¥¤¥È¤òÆɤ߽Ф¹¡£
-¸½ºß¤Î¥Õ¥¡¥¤¥ë¥ª¥Õ¥»¥Ã¥È¤ÏŬÀÚ¤ËÄ´À°¤µ¤ì¤ë¡£
+の現在のファイルオフセットから始まるバイトを読み出す。
+現在のファイルオフセットは適切に調整される。
 .I fd_in
-¤¬¥Ñ¥¤¥×¤ò»²¾È¤·¤Æ¤ª¤é¤º¡¢
+がパイプを参照しておらず、
 .I off_in
-¤¬ NULL ¤Ç¤Ê¤¤¾ì¹ç¡¢
+が NULL でない場合、
 .I off_in
-¤Ï
+は
 .I fd_in
-¤«¤é¤Î¥Ç¡¼¥¿Æɤ߽Ф·¤ò³«»Ï¤¹¤ëÀèƬ¥ª¥Õ¥»¥Ã¥È¤ò³ÊǼ¤·¤¿¥Ð¥Ã¥Õ¥¡
-¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢
+ã\81\8bã\82\89ã\81®ã\83\87ã\83¼ã\82¿èª­ã\81¿å\87ºã\81\97ã\82\92é\96\8bå§\8bã\81\99ã\82\8bå\85\88é ­ã\82ªã\83\95ã\82»ã\83\83ã\83\88ã\82\92æ ¼ç´\8dã\81\97ã\81\9fã\83\90ã\83\83ã\83\95ã\82¡
+へのポインタでなければならない。この場合、
 .I fd_in
-¤Î¸½ºß¤Î¥Õ¥¡¥¤¥ë¥ª¥Õ¥»¥Ã¥È¤ÏÊѹ¹¤µ¤ì¤Ê¤¤¡£
+の現在のファイルオフセットは変更されない。
 .I fd_out
-¤È
+と
 .I off_out
-¤Ë´Ø¤·¤Æ¤âƱÍͤǤ¢¤ë¡£
+に関しても同様である。
 .PP
 .I flags
-°ú¤­¿ô¤Ë¤Ï¡¢°Ê²¼¤ÎÃͤΠ0 ¸Ä°Ê¾å¤Î¥Ó¥Ã¥Èñ°Ì¤ÎÏÀÍýϤò
-¤È¤Ã¤¿¤â¤Î¤ò»ØÄꤹ¤ë:
+引き数には、以下の値の 0 個以上のビット単位の論理和を
+とったものを指定する:
 .TP 1.9i
 .B SPLICE_F_MOVE
-¥Ú¡¼¥¸¤Î¥³¥Ô¡¼¤Ç¤Ê¤¯°ÜÆ°¤ò»î¤ß¤ë¡£
-¤³¤ì¤Ï¥«¡¼¥Í¥ë¤ËÂФ¹¤ë¥Ò¥ó¥È¤Ç¤·¤«¤Ê¤¤¡£
-¤Ä¤Þ¤ê¡¢¥«¡¼¥Í¥ë¤¬¥Ñ¥¤¥×¤«¤é¥Ú¡¼¥¸¤ò°ÜÆ°¤Ç¤­¤Ê¤¤¾ì¹ç¤ä¡¢
-¥Ñ¥¤¥×¥Ð¥Ã¥Õ¥¡¤¬¥Ú¡¼¥¸Á´Éô¤ò»²¾È¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢
-¥Ú¡¼¥¸¤Î¥³¥Ô¡¼¤¬¹Ô¤ï¤ì¤ë¤³¤È¤â¤¢¤ë¡£
-¤³¤Î¥Õ¥é¥°¤ÎºÇ½é¤Î¼ÂÁõ¤Ë¤Ï¥Ð¥°¤¬¤¢¤Ã¤¿¡£¤½¤Î¤¿¤á¡¢
-Linux 2.6.21 °Ê¹ß¤Ç¤Ï¤³¤Î¥Õ¥é¥°¤ÎÁàºî¤Ï¤Ç¤­¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë
-(¤¿¤À¤·¡¢
+ページのコピーでなく移動を試みる。
+これはカーネルに対するヒントでしかない。
+つまり、カーネルがパイプからページを移動できない場合や、
+パイプバッファがページ全部を参照していない場合は、
+ページのコピーが行われることもある。
+このフラグの最初の実装にはバグがあった。そのため、
+Linux 2.6.21 以降ではこのフラグの操作はできないようになっている
+(ただし、
 .BR splice ()
-¥³¡¼¥ë¤Ç¤³¤Î¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤³¤È¤Ïº£¤âǧ¤á¤é¤ì¤Æ¤¤¤ë)¡£
-¾­Íè¡¢Àµ¤·¤¤¼ÂÁõ¤¬¹Ô¤ï¤ì¤ë¤³¤È¤À¤í¤¦¡£
+コールでこのフラグを指定することは今も認められている)。
+将来、正しい実装が行われることだろう。
 .TP
 .B SPLICE_F_NONBLOCK
-Æþ½ÐÎÏ»þ¤ËÄä»ß (block) ¤·¤Ê¤¤¡£
-¤³¤Î¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢
-splice ¤Ë¤è¤ë¥Ñ¥¤¥×Áàºî¤òÈóÄä»ß¥â¡¼¥É (nonblocking) ¤Ç
-¹Ô¤ª¤¦¤È¤¹¤ë¤¬¡¢¤½¤Î¾ì¹ç¤Ç¤â
+入出力時に停止 (block) しない。
+このフラグを指定すると、
+splice によるパイプ操作を非停止モード (nonblocking) で
+行おうとするが、その場合でも
 .BR splice ()
-¤ÏÄä»ß¤¹¤ë¤³¤È¤â¤¢¤ë¡£¤Ê¤¼¤Ê¤é¡¢¥Ç¡¼¥¿¤Î¤ä¤ê¼è¤ê¤ò¹Ô¤¦
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ï
+は停止することもある。なぜなら、データのやり取りを行う
+ファイルディスクリプタは
 .RB ( O_NONBLOCK
-¥Õ¥é¥°¤ò¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç) Ää»ß¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤«¤é¤Ç¤¢¤ë¡£
+フラグをセットされていない場合) 停止する可能性があるからである。
 .TP
 .B SPLICE_F_MORE
-¤³¤Î¸å¤Î splice ¤Ç¤µ¤é¤ËžÁ÷¤µ¤ì¤ë¥Ç¡¼¥¿¤¬¤¢¤ë¤³¤È¤ò¼¨¤¹¡£
-¤³¤Î¥Õ¥é¥°¤Ï
+この後の splice でさらに転送されるデータがあることを示す。
+このフラグは
 .I fd_out
-¤¬¥½¥±¥Ã¥È¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¤ËÍ­ÍѤʥҥó¥È¤È¤Ê¤ë
+がソケットを参照している場合に有用なヒントとなる
 .RB ( send (2)
-¤Î
+の
 .B MSG_MORE
-¤ä
+や
 .BR tcp (7)
-¤Î
+の
 .B TCP_CORK
-¤ÎÀâÌÀ¤â»²¾È)¡£
+の説明も参照)。
 .TP
 .B SPLICE_F_GIFT
 .BR splice ()
-¤Ç¤Ï»ÈÍѤ·¤Ê¤¤¡£
+では使用しない。
 .BR vmsplice (2)
-»²¾È¡£
-.SH ÊÖ¤êÃÍ
-À®¸ù¤·¤Æ´°Î»¤¹¤ë¤È¡¢
+参照。
+.SH 返り値
+成功して完了すると、
 .BR splice ()
-¤Ï¥Ñ¥¤¥×¤«¤é½Ð¤·Æþ¤ì¤·¤¿¥Ð¥¤¥È¿ô¤òÊÖ¤¹¡£
-ÊÖ¤êÃÍ 0 ¤Ï¥Ç¡¼¥¿¤ÎžÁ÷¤¬¹Ô¤ï¤Ê¤«¤Ã¤¿¤³¤È¤ò¼¨¤¹¡£
-¤³¤Î¾ì¹ç¡¢½èÍý¤òÄä»ß (block) ¤·¤Æ¤â̵°ÕÌ£¤Ç¤¢¤ë¡£
-¤Ê¤¼¤Ê¤é¡¢
+はパイプから出し入れしたバイト数を返す。
+返り値 0 はデータの転送が行わなかったことを示す。
+この場合、処理を停止 (block) しても無意味である。
+なぜなら、
 .I fd_in
-¤¬»²¾È¤¹¤ë¥Ñ¥¤¥×¤Î½ñ¤­¹þ¤ß¦¤ËÀܳ¤µ¤ì¤Æ¤¤¤ë¼Ô¤¬¤¤¤Ê¤¤¤«¤é¤Ç¤¢¤ë¡£
+が参照するパイプの書き込み側に接続されている者がいないからである。
 .PP
-¥¨¥é¡¼¤Î¾ì¹ç¡¢
+エラーの場合、
 .BR splice ()
-¤Ï \-1 ¤òÊÖ¤·¡¢
+は \-1 を返し、
 .I errno
-¤Ë¥¨¥é¡¼¤ò¼¨¤¹ÃͤòÀßÄꤹ¤ë¡£
-.SH ¥¨¥é¡¼
+にエラーを示す値を設定する。
+.SH ã\82¨ã\83©ã\83¼
 .TP
 .B EBADF
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î°ìÊý¤Þ¤¿¤ÏξÊý¤¬Í­¸ú¤Ç¤Ï¤Ê¤¤¡¢
-¤â¤·¤¯¤ÏŬÀڤʠread-write ¥â¡¼¥É¤Ç¤Ï¤Ê¤¤¡£
+ファイルディスクリプタの一方または両方が有効ではない、
+もしくは適切な read-write モードではない。
 .TP
 .B EINVAL
-ÂоݤΥե¡¥¤¥ë¥·¥¹¥Æ¥à¤¬ splice ¤ËÂбþ¤·¤Æ¤¤¤Ê¤¤¡¢
-¤Þ¤¿¤ÏÂоݤΥե¡¥¤¥ë¤¬Äɵ­¥â¡¼¥É¤Ç¥ª¡¼¥×¥ó¤µ¤ì¤Æ¤¤¤ë¡¢
-.\" Äɵ­¥â¡¼¥É¤Ç¤Î¥¨¥é¡¼¤Ï 2.6.27 °Ê¹ß¤ÇȯÀ¸¤¹¤ë¡£
-.\" ¤½¤ì¤è¤êÁ°¤Î¥«¡¼¥Í¥ë¤Ç¤ÏÄɵ­¥â¡¼¥É¤Ç¤Î splice() ¤ÏÀµ¤·¤¯Æ°ºî¤·¤Ê¤¤¡£
-¤Þ¤¿¤Ï¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¤É¤Á¤é¤â¥Ñ¥¤¥×¤ò»²¾È¤·¤Æ¤¤¤Ê¤¤¡¢
-¤Þ¤¿¤Ï seek ¤Ç¤­¤Ê¤¤¥Ç¥Ð¥¤¥¹¤ËÂФ·¤Æ¥ª¥Õ¥»¥Ã¥È¤¬»ØÄꤵ¤ì¤¿¡£
+対象のファイルシステムが splice に対応していない、
+または対象のファイルが追記モードでオープンされている、
+.\" 追記モードでのエラーは 2.6.27 以降で発生する。
+.\" それより前のカーネルでは追記モードでの splice() は正しく動作しない。
+またはディスクリプタのどちらもパイプを参照していない、
+または seek できないデバイスに対してオフセットが指定された。
 .TP
 .B ENOMEM
-¥á¥â¥êÉÔ­¡£
+メモリ不足。
 .TP
 .B ESPIPE
 .I off_in
-¤«
+か
 .I off_out
-¤Î¤¤¤º¤ì¤«¤¬ NULL ¤Ç¤Ï¤Ê¤¤¤¬¡¢Âбþ¤¹¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬
-¥Ñ¥¤¥×¤ò»²¾È¤·¤Æ¤¤¤ë¡£
-.SH ¥Ð¡¼¥¸¥ç¥ó
+のいずれかが NULL ではないが、対応するファイルディスクリプタが
+パイプを参照している。
+.SH バージョン
 .BR splice ()
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï Linux 2.6.17 ¤Ç½é¤á¤ÆÅо줷¤¿¡£
-.SH ½àµò
-¤³¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï Linux ¸ÇÍ­¤Ç¤¢¤ë¡£
-.SH Ãí°Õ
-3 ¤Ä¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë
+システムコールは Linux 2.6.17 で初めて登場した。
+.SH 準拠
+このシステムコールは Linux 固有である。
+.SH 注意
+3 つのシステムコール
 .RB ( splice (),
 .BR vmsplice (2),
 .BR tee (2))
-¤ò»È¤¦¤È¡¢¥æ¡¼¥¶¶õ´Ö¥×¥í¥°¥é¥à¤ÏǤ°Õ¤Î¥«¡¼¥Í¥ë¥Ð¥Ã¥Õ¥¡¤ËÂФ¹¤ë
-´°Á´¤ÊÀ©¸æ¤¬¤Ç¤­¤ë¡£¥«¡¼¥Í¥ë¥Ð¥Ã¥Õ¥¡¤Ï¡¢¥Ñ¥¤¥×¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤ë¤Î¤È
-Ʊ¼ï¤Î¥Ð¥Ã¥Õ¥¡¤ò»È¤Ã¤Æ¥«¡¼¥Í¥ëÆâ¤Ë¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¡£
-Âç¤Þ¤«¤Ë¤¤¤¦¤È¡¢¤³¤ì¤é¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï°Ê²¼¤Î»Å»ö¤ò¹Ô¤¦:
+を使うと、ユーザ空間プログラムは任意のカーネルバッファに対する
+完全な制御ができる。カーネルバッファは、パイプに使用されているのと
+同種のバッファを使ってカーネル内に実装されている。
+大まかにいうと、これらのシステムコールは以下の仕事を行う:
 .TP 1.2i
 .BR splice ()
-¥Ð¥Ã¥Õ¥¡¤«¤éǤ°Õ¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ä¡¢¤½¤ÎµÕÊý¸þ¡¢
-¤â¤·¤¯¤Ï¤¢¤ë¥Ð¥Ã¥Õ¥¡¤«¤éÊ̤ΥХåե¡¤Ø¤Î¡¢¥Ç¡¼¥¿°ÜÆ°¤ò¹Ô¤¦¡£
+バッファから任意のファイルディスクリプタや、その逆方向、
+もしくはあるバッファから別のバッファへの、データ移動を行う。
 .TP
 .BR tee (2)
-¤¢¤ë¥Ð¥Ã¥Õ¥¡¤«¤éÊ̤ΥХåե¡¤Ø¤Î¥Ç¡¼¥¿¡Ö¥³¥Ô¡¼¡×¤ò¹Ô¤¦¡£
+あるバッファから別のバッファへのデータ「コピー」を行う。
 .TP
 .BR vmsplice (2)
-¥æ¡¼¥¶¶õ´Ö¤«¤é¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ç¡¼¥¿¡Ö¥³¥Ô¡¼¡×¤ò¹Ô¤¦¡£
+ユーザ空間からバッファへのデータ「コピー」を行う。
 .PP
-¤³¤³¤Ç¤Ï¥³¥Ô¡¼¤ÎÏäò¤·¤Æ¤¤¤ë¤¬¡¢¼ÂºÝ¤Î¥³¥Ô¡¼¤Ï°ìÈÌŪ¤Ë²óÈò¤µ¤ì¤ë¡£
-¥«¡¼¥Í¥ë¤Ï¡¢¥Ñ¥¤¥×¡¦¥Ð¥Ã¥Õ¥¡¤ò¥«¡¼¥Í¥ë¥á¥â¥ê¤Î¥Ú¡¼¥¸¤Ø¤Î¥Ý¥¤¥ó¥¿½¸¹ç¤È¤·¤Æ
-¼ÂÁõ¤·¡¢¥Ú¡¼¥¸¤Ø¤Î»²¾È²ó¿ô¤ò´ÉÍý¤¹¤ë¤³¤È¤Ç¡¢¤³¤ì¤ò¼Â¸½¤·¤Æ¤¤¤ë¡£
-¥«¡¼¥Í¥ë¤Ï¡¢ÂоݤȤʤë¥Ú¡¼¥¸¤ò»²¾È¤¹¤ë (½ÐÎϥХåե¡ÍѤÎ) ¥Ý¥¤¥ó¥¿¤ò
-¿·µ¬¤ËºîÀ®¤¹¤ë¤³¤È¤Ç¥Ð¥Ã¥Õ¥¡Æâ¤Î¥Ú¡¼¥¸¤Î¡Ö¥³¥Ô¡¼¡×¤òºîÀ®¤·¡¢
-¤½¤Î¥Ú¡¼¥¸¤Î»²¾È²ó¿ô¤òÁý¤ä¤¹¡£¤Ä¤Þ¤ê¡¢¥Ý¥¤¥ó¥¿¤À¤±¤¬¥³¥Ô¡¼¤µ¤ì¡¢
-¥Ð¥Ã¥Õ¥¡¤Î¥Ú¡¼¥¸¤Ï¥³¥Ô¡¼¤µ¤ì¤Ê¤¤¡£
+ここではコピーの話をしているが、実際のコピーは一般的に回避される。
+カーネルは、パイプ・バッファをカーネルメモリのページへのポインタ集合として
+実装し、ページへの参照回数を管理することで、これを実現している。
+カーネルは、対象となるページを参照する (出力バッファ用の) ポインタを
+新規に作成することでバッファ内のページの「コピー」を作成し、
+そのページの参照回数を増やす。つまり、ポインタだけがコピーされ、
+バッファのページはコピーされない。
 .\"
 .\" Linus: Now, imagine using the above in a media server, for example.
 .\" Let's say that a year or two has passed, so that the video drivers
@@ -222,10 +222,10 @@ splice 
 .\" the data and choose to forward it to two or more different
 .\" users - for things like logging etc.).
 .\"
-.SH Îã
+.SH 
 .BR tee (2)
-»²¾È¡£
-.SH ´ØÏ¢¹àÌÜ
+参照。
+.SH 関連項目
 .BR sendfile (2),
 .BR tee (2),
 .BR vmsplice (2)