.\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)dup.2 8.1 (Berkeley) 6/4/93 .\" %FreeBSD: src/lib/libc/sys/dup.2,v 1.9.2.5 2001/08/17 15:42:44 ru Exp % .\" .\" $FreeBSD: doc/ja_JP.eucJP/man/man2/dup.2,v 1.5 2001/07/29 05:15:12 horikawa Exp $ .Dd June 4, 1993 .Dt DUP 2 .Os .Sh 名称 .Nm dup , .Nm dup2 .Nd 既存のファイル記述子を複製する .Sh ライブラリ .Lb libc .Sh 書式 .Fd #include .Ft int .Fn dup "int oldd" .Ft int .Fn dup2 "int oldd" "int newd" .Sh 解説 .Fn dup は既存のオブジェクト記述子を複製し、その値を呼び出しプロセスに返します .Fa ( newd = .Fn dup oldd ) 。 引数 .Fa oldd はプロセスの記述子テーブル内のインデックスで、負でない小さな整数です。 その値はテーブルのサイズより小さくなければなりません。 テーブルのサイズは .Xr getdtablesize 2 によって返されます。 .Fn dup 呼び出しは、そのときにプロセスによって使用されていない番号のうち、 最も小さい番号の付いた記述子を返します。 .Pp 記述子が参照するオブジェクトは .Fa oldd と .Fa newd をまったく区別しません。したがって .Fa newd と .Fa oldd がオープンされたファイルへの複製された参照だった場合、すべての .Xr read 2 , .Xr write 2 および .Xr lseek 2 呼び出しは、単一のポインタをファイル内で移動します。 追加モード、ノンブロッキング入出力 および非同期入出力オプションは各参照の間で共有されます。 一つのファイルへの別々のポインタが必要な場合は、追加の .Xr open 2 を呼び出し、ファイルへの異なるオブジェクト参照を 得る必要があります。このとき、新しいファイル記述子の close-on-exec フラグは設定解除されています。 .Pp .Fn dup2 には新しい記述子 .Fa newd の値を指定します。この記述子が既に使用されていた場合、 .Fa oldd \*(Ne .Fa newd であれば、まずその記述子は .Xr close 2 が呼び出されたかのように割り当て解除されます。 .Fa oldd が有効な記述子でなかった場合には、 .Fa newd はクローズされません。 .Fa oldd == .Fa newd であり、しかも .Fa oldd が有効な記述子の場合、 .Fn dup2 は正常に終了し、何もしません。 .Sh 実装に関する注 非スレッドライブラリ .Fn dup は .Va dup システムコールとして実装されています。 .Pp スレッドライブラリの場合、 .Va dup システムコールが .Fn _thread_sys_dup にアセンブルされ、 .Fn dup は読み書きについて .Fa oldd をロックしてから、 .Fn _thread_sys_dup を呼び出す関数として実装されています。 戻る前に .Fn dup は .Fa oldd をアンロックします。 .Pp 非スレッドライブラリ .Fn dup2 は、 .Va dup2 システムコールとして実現されます。 .Pp スレッドライブラリでは、 .Va dup2 システムコールは .Fn _thread_sys_dup2 にアセンブルされ、 .Fn dup2 は、読み書きについて .Fa oldd と .Fa newd の両方をロックしてから、 .Fn _thread_sys_dup2 を呼び出す関数として実現されます。戻る前に、 .Fn dup2 は .Fa oldd と .Fa newd をアンロックします。 .Sh 戻り値 いずれかの呼び出しでエラーが起きた場合は値 -1 が返されます。 外部変数 .Va errno はエラーの原因を示します。 .Sh エラー .Fn dup と .Fn dup2 は次の場合に処理に失敗します。 .Bl -tag -width Er .It Bq Er EBADF .Fa oldd または .Fa newd が有効なアクティブ記述子ではありません。 .It Bq Er EMFILE アクティブな記述子が多すぎます。 .El .Sh 関連項目 .Xr accept 2 , .Xr close 2 , .Xr fcntl 2 , .Xr getdtablesize 2 , .Xr open 2 , .Xr pipe 2 , .Xr socket 2 , .Xr socketpair 2 .Sh 規格 .Fn dup 関数と .Fn dup2 関数は、 .St -p1003.1-90 に準拠しています。 .Sh 歴史 .Fn dup 関数と .Fn dup2 関数は .At v7 で登場しました。