OSDN Git Service

Update README
[linuxjm/LDP_man-pages.git] / draft / man2 / dup.2
index 5a7f0d7..83d753d 100644 (file)
@@ -50,9 +50,9 @@
 .\" Updated 2008-02-10, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.77
 .\" Updated 2008-11-09, Akihiro MOTOKI, LDP v3.13
 .\"
-.TH DUP 2 2014\-07\-08 Linux "Linux Programmer's Manual"
+.TH DUP 2 2015\-01\-22 Linux "Linux Programmer's Manual"
 .SH 名前
-dup, dup2, dup3 \- ファイルディスクリプタを複製する
+dup, dup2, dup3 \- ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92è¤\87製ã\81\99ã\82\8b
 .SH 書式
 .nf
 \fB#include <unistd.h>\fP
@@ -67,53 +67,60 @@ dup, dup2, dup3 \- ファイルディスクリプタを複製する
 \fBint dup3(int \fP\fIoldfd\fP\fB, int \fP\fInewfd\fP\fB, int \fP\fIflags\fP\fB);\fP
 .fi
 .SH 説明
-\fBdup\fP() システムコールは、 ファイルディスクリプタ \fIoldfd\fP のコピーを作成し、 最も小さい番号の未使用のディスクリプタ
-新しいディスクリプタとして使用する。
+\fBdup\fP() システムコールは、 ファイルディスクリプター \fIoldfd\fP のコピーを作成し、 最も小さい番号の未使用のディスクリプター
\96°ã\81\97ã\81\84ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81\99ã\82\8bã\80\82
 
\88\90å\8a\9fã\81\8cè¿\94ã\81\95ã\82\8cã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81 å\8f¤ã\81\84ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81¨æ\96°ã\81\97ã\81\84ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿は 互いに可換なものとして使うことができる。
-2つのファイルディスクリプタは同じファイル記述 (description)  (\fBopen\fP(2)  参照)
-を参照しており、したがってファイルオフセットやファイル状態フラグが 共有される。例えば、一方のディスクリプタに対して \fBlseek\fP(2)
-を使ってファイルオフセットを変更した場合、もう一方のディスクリプタの オフセットも変化する。
\88\90å\8a\9fã\81\8cè¿\94ã\81\95ã\82\8cã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81 å\8f¤ã\81\84ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¨æ\96°ã\81\97ã\81\84ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼は 互いに可換なものとして使うことができる。
+2ã\81¤ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯å\90\8cã\81\98ã\83\95ã\82¡ã\82¤ã\83«è¨\98è¿° (description)  (\fBopen\fP(2)  å\8f\82ç\85§)
\82\92å\8f\82ç\85§ã\81\97ã\81¦ã\81\8aã\82\8aã\80\81ã\81\97ã\81\9fã\81\8cã\81£ã\81¦ã\83\95ã\82¡ã\82¤ã\83«ã\82ªã\83\95ã\82»ã\83\83ã\83\88ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ç\8a¶æ\85\8bã\83\95ã\83©ã\82°ã\81\8c å\85±æ\9c\89ã\81\95ã\82\8cã\82\8bã\80\82ä¾\8bã\81\88ã\81°ã\80\81ä¸\80æ\96¹ã\81®ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ \fBlseek\fP(2)
\82\92使ã\81£ã\81¦ã\83\95ã\82¡ã\82¤ã\83«ã\82ªã\83\95ã\82»ã\83\83ã\83\88ã\82\92å¤\89æ\9b´ã\81\97ã\81\9få ´å\90\88ã\80\81ã\82\82ã\81\86ä¸\80æ\96¹ã\81®ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81® ã\82ªã\83\95ã\82»ã\83\83ã\83\88ã\82\82å¤\89å\8c\96ã\81\99ã\82\8bã\80\82
 
 .\"
-2ã\81¤ã\81®ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81¯ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83\95ã\83©ã\82° (close\-on\-exec flag)  ã\82\92å\85±æ\9c\89ã\81\97ã\81ªã\81\84ã\80\82è¤\87製ã\81\95ã\82\8cã\81\9fã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿
+2ã\81¤ã\81®ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\83\95ã\83©ã\82° (close\-on\-exec flag)  ã\82\92å\85±æ\9c\89ã\81\97ã\81ªã\81\84ã\80\82è¤\87製ã\81\95ã\82\8cã\81\9fã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼
 close\-on\-exec flag (\fBfcntl\fP(2)  参照) は off となる。
 .SS dup2()
-The \fBdup2\fP()  system call performs the same task as \fBdup\fP(), but instead
-of using the lowest\-numbered unused file descriptor, it uses the descriptor
-number specified in \fInewfd\fP.  If the descriptor \fInewfd\fP was previously
-open, it is silently closed before being reused.
+\fBdup2\fP() システムコールは \fBdup\fP() と同じ処理を実行するが、
+番号が最も小さい未使用のファイルディスクリプターを使用する代わりに、
+\fInewfd\fP で指定されたディスクリプター番号を使用する。
+ディスクリプター \fInewfd\fP が以前にオープンされていた場合には、
+黙ってそのディスクリプターをクローズしてから再利用する。
 
-The steps of closing and reusing the file descriptor \fInewfd\fP are performed
-\fIatomically\fP.  This is important, because trying to implement equivalent
-functionality using \fBclose\fP(2)  and \fBdup\fP()  would be subject to race
-conditions, whereby \fInewfd\fP might be reused between the two steps.  Such
-reuse could happen because the main program is interrupted by a signal
-handler that allocates a file descriptor, or because a parallel thread
-allocates a file descriptor.
+ファイルディスクリプター \fInewfd\fP をクローズして再利用する処理は
+\fIアトミック(不可分)に\fP実行される。これは重要な点である。 なぜなら、
+等価な機能を \fBclose\fP(2) と \fBdup\fP() を使って実装しようとすると、
+2 つの処理の間に \fInewfd\fP が再利用されてしまうという、
+競合状態にさらされることになるからだ。
+このような再利用が起こるのは、
+メインプログラムがファイルディスクリプターを割り当てる
+シグナルハンドラーにより割り込まれたり、並行動作するスレッドが
+ファイルディスクリプターを割り当てたりすることがあるからだ。
 
 以下の点について注意すること:
 .IP * 3
-\fIoldfd\fP が有効なファイルディスクリプタでない場合、その呼び出しは失敗し、 \fInewfd\fP はクローズされない。
+\fIoldfd\fP ã\81\8cæ\9c\89å\8a¹ã\81ªã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§ã\81ªã\81\84å ´å\90\88ã\80\81ã\81\9dã\81®å\91¼ã\81³å\87ºã\81\97ã\81¯å¤±æ\95\97ã\81\97ã\80\81 \fInewfd\fP ã\81¯ã\82¯ã\83­ã\83¼ã\82ºã\81\95ã\82\8cã\81ªã\81\84ã\80\82
 .IP *
 .\"
-\fIoldfd\fP が有効なファイルディスクリプタで、 \fInewfd\fP が \fIoldfd\fP と同じ値の場合、 \fBdup2\fP()  は何もせず、
+\fIoldfd\fP ã\81\8cæ\9c\89å\8a¹ã\81ªã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§ã\80\81 \fInewfd\fP ã\81\8c \fIoldfd\fP ã\81¨å\90\8cã\81\98å\80¤ã\81®å ´å\90\88ã\80\81 \fBdup2\fP()  ã\81¯ä½\95ã\82\82ã\81\9bã\81\9aã\80\81
 \fInewfd\fP を返す。
 .SS dup3()
 \fBdup3\fP()  は \fBdup2\fP()  と同じだが、以下の点が異なる。
 .IP * 3
-呼び出し元が、新しいファイルディスクリプタに対して close\-on\-exec フラグを強制的に設定することができる。 これを行うには、
\91¼ã\81³å\87ºã\81\97å\85\83ã\81\8cã\80\81æ\96°ã\81\97ã\81\84ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ close\-on\-exec ã\83\95ã\83©ã\82°ã\82\92å¼·å\88¶ç\9a\84ã\81«è¨­å®\9aã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\82\8bã\80\82 ã\81\93ã\82\8cã\82\92è¡\8cã\81\86ã\81«ã\81¯ã\80\81
 \fIflags\fP に \fBO_CLOEXEC\fP を指定する。 このフラグが役に立つ理由については、 \fBopen\fP(2)  の \fBO_CLOEXEC\fP
 フラグの説明を参照のこと。
 .IP *
 .\" FIXME . To confirm with Al Viro that this was intended, and its rationale
 \fIoldfd\fP が \fInewfd\fP と同じ場合、 \fBdup3\fP()  は \fBEINVAL\fP エラーで失敗する。
 .SH 返り値
-成功すると、これらのシステムコールは新しいディスクリプタを返す。 エラーの場合、\-1 を返し、 \fIerrno\fP を適切に設定する。
\88\90å\8a\9fã\81\99ã\82\8bã\81¨ã\80\81ã\81\93ã\82\8cã\82\89ã\81®ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81¯æ\96°ã\81\97ã\81\84ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92è¿\94ã\81\99ã\80\82 ã\82¨ã\83©ã\83¼ã\81®å ´å\90\88ã\80\81\-1 ã\82\92è¿\94ã\81\97ã\80\81 \fIerrno\fP ã\82\92é\81©å\88\87ã\81«è¨­å®\9aã\81\99ã\82\8bã\80\82
 .SH エラー
 .TP 
 \fBEBADF\fP
-\fIoldfd\fP がオープンされたファイルディスクリプタでないか、 \fInewfd\fP がファイルディスクリプタとして許される範囲から外れている。
+\fIoldfd\fP がオープンされたファイルディスクリプターではない。
+.TP 
+\fBEBADF\fP
+\fInewfd\fP がファイルディスクリプターとして許可されている範囲ではない (\fBgetrlimit\fP(2) の \fBRLIMIT_NOFILE\fP
+の議論を参照)。
 .TP 
 \fBEBUSY\fP
 (Linux のみ)  \fBopen\fP(2)  や \fBdup\fP()  との競合状態の場合に、 \fBdup2\fP()  や \fBdup3\fP()
@@ -123,11 +130,15 @@ allocates a file descriptor.
 \fBdup2\fP()  や \fBdup3\fP()  の呼び出しがシグナルにより割り込まれた。 \fBsignal\fP(7)  参照。
 .TP 
 \fBEINVAL\fP
+(\fBdup3\fP())  \fIflags\fP に無効な値が入っている。
+.TP 
+\fBEINVAL\fP
 .\" FIXME . To confirm with Al Viro that this was intended, and its rationale
-(\fBdup3\fP())  \fIflags\fP に無効な値が入っている。 もしくは、 \fIoldfd\fP が \fInewfd\fP と同じであった。
+(\fBdup3\fP()) \fIoldfd\fP が \fInewfd\fP と同じであった。
 .TP 
 \fBEMFILE\fP
-プロセスがすでにオープンできる最大数までファイルディスクリプタ を開いていて、さらに新しいものを開こうとした。
+プロセスがすでにオープンできる最大数までファイルディスクリプター を開いていて、さらに新しいものを開こうとした (\fBgetrlimit\fP(2)
+のリソース上限 \fBRLIMIT_NOFILE\fP を参照)。
 .SH バージョン
 \fBdup3\fP()  はバージョン 2.6.27 で Linux に追加された。 glibc によるサポートはバージョン 2.9 以降で利用できる。
 .SH 準拠
@@ -141,41 +152,43 @@ allocates a file descriptor.
 \fInewfd\fP が範囲を超えた時に返されるエラーは、 \fBdup2\fP()  と \fBfcntl(\fP..., \fBF_DUPFD\fP, ...\fB)\fP
 では異っている。 \fBdup2\fP()  が \fBF_DUPFD\fP と同じように \fBEINVAL\fP を返すシステムもある。
 
-If \fInewfd\fP was open, any errors that would have been reported at
-\fBclose\fP(2)  time are lost.  If this is of concern, then\(emunless the
-program is single\-threaded and does not allocate file descriptors in signal
-handlers\(emthe correct approach is \fInot\fP to close \fInewfd\fP before calling
-\fBdup2\fP(), because of the race condition described above.  Instead, code
-something like the following could be used:
+\fInewfd\fP がオープンされていた場合、
+\fBclose\fP(2) 時に報告されることになるエラーはすべて失われる。
+これが心配で、シングルスレッドかつシグナルハンドラーで
+ファイルディスクリプターを割り当てるようなプログラムでない場合には、
+正しい方法は \fBdup2\fP() を呼び出す前に
+\fInewfd\fP をクローズ「しない」ことである。
+なぜなら、上で説明した競合状況があるからである。
+代わりに、以下のようなコードが使用できることだろう。
 
 .nf
-    /* Obtain a duplicate of 'newfd' that can subsequently
-       be used to check for close() errors; an EBADF error
-       means that 'newfd' was not open. */
+    /* あとで close() エラーをチェックするのに使用できる
+       ように 'newfd' の複製を取得する。 EBADF エラーは
+       'newfd' がオープンされていないことを意味する。 */
 
     tmpfd = dup(newfd);
     if (tmpfd == \-1 && errno != EBADF) {
-        /* Handle unexpected dup() error */
+        /* 予期しない dup() のエラーを処理する */
     }
 
-    /* Atomically duplicate 'oldfd' on 'newfd' */
+    /* アトミックに 'oldfd' を 'newfd' に複製する */
 
     if (dup2(oldfd, newfd) == \-1) {
-        /* Handle dup2() error */
+        /* dup2() のエラーを処理する */
     }
 
-    /* Now check for close() errors on the file originally
-       referred to by 'newfd' */
+    /* ここでもともと 'newfd' で参照されていたファイルの
+       close() エラーをチェックする */
 
     if (tmpfd != \-1) {
         if (close(tmpfd) == \-1) {
-            /* Handle errors from close */
+            /* close からのエラーを処理する */
         }
     }
 .fi
 .SH 関連項目
 \fBclose\fP(2), \fBfcntl\fP(2), \fBopen\fP(2)
 .SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.75 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
 である。プロジェクトの説明とバグ報告に関する情報は
 http://www.kernel.org/doc/man\-pages/ に書かれている。