dup (システムコール)

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

Unix ライクなオペレーティング システムでは、dup (「複製」の略) およびdup2システム コールは、指定されたファイル記述子のコピーを作成しますこの新しい記述子は、実際にはコピーのようには動作しませんが、古いもの のエイリアスのように動作します。

C ライブラリ POSIX 定義

dup および dup2 呼び出しは、POSIX仕様によって標準化されています。[1]ポインターと同様に (ロジックに従って)、新しいファイル記述は古いファイル記述の単なるエイリアスであり、両方のファイル記述子を交換可能に使用できます。dup() システム コールの両方のファイル ディスクリプタは、同じオープン ファイル記述を参照します。つまり、ファイル オフセットとファイル ステータス フラグを共有します。ポインター、浅いまたは深いコピーまたは参照で使用されるロジックと似ていますが、同一ではありません。ファイル記述子の 1 つのオフセットを変更すると、他のファイル記述子のオフセットが変更されます。dup() を使用する場合、2 つのファイル記述子は同じファイル記述子フラグを共有しません。. 呼び出しプロセスでは、番号が最も小さい未使用のファイル記述子が新しいファイル記述子番号として使用されます。dup2()システムコールを使用すると、コールの newfd 変数で指定されたファイル記述子番号を使用することを除いて、dup() と同じタスクが実行されます。つまり、newfd は oldff ファイル記述を参照するように調整されます。この関数ファミリの最後のシステム コールは dup3() です。これは dup2() と同じですが、oldfd が newfd と等しい場合、システム コールはエラー EINVAL で失敗し、呼び出し元は flags で O_CLOEXEC を指定することにより、close-on-exec フラグを強制的に設定できます。[2] dup3() は正式にLinux カーネルバージョン 2.6.27 に追加されました (glibc サポートはバージョン 2.9 以降で利用可能です)。

int dup ( int oldfd );   
int dup2 ( int oldfd int newfd );     

前者は、open()の動作と同様に、最初に使用可能な記述子を割り当てます。ファイル記述子を指定されていない場所に複製する別の方法は、コマンド を使用したfcntlシステム コールです。F_DUPFD

後者は、コピーを newfd に配置します。newfd が開いている場合は、最初に閉じます。

入出力リダイレクト用の dup2

Unix シェルは、入出力のリダイレクトにdup2を使用しますとともに、 Unix パイプが依存 するツールです。pipe()

次の例では、 Unix パイプを使用して2 つの個別のプロセス ( program1program2 ) を接続するためにpipe()、 とを使用しています。 dup()

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

/* 関数プロトタイプ */
ボイドダイ( const char * ) ;  
 
int main ( int argc , char ** argv ) {     
	int pdes [ 2 ]; 
	pid_t; 
 
	if (パイプ( pdes ) == -1 )  
		死にます( "パイプ()" );
 
	=フォーク();  
	if (== ( pid_t )( -1 ))  
        	死にます( "フォーク()" ); /* フォークに失敗しました */ 
 
	if (== ( pid_t ) 0 ) {   
        	/* 子プロセス */

        	閉じる( 1 ); /* 標準出力を閉じます */       
        	
        	if ( dup ( pdes [ 1 ]) == -1 )  
        		死にます( "dup()" );
        	
        	/* stdout と pdes[1] は同等になりました (dup は最小の空きディスクリプタを返します) */

        	if (( execlp ( "program1" , "program1" , "arg1" , NULL )) == -1 )     
        		死にます( "execlp()" );

		_exit ( EXIT_SUCCESS );
	}その他{  
        	/* 親プロセス */

        	閉じる( 0 ); /* 標準入力を閉じます */       
        	
        	if (重複( pdes [ 0 ]) == -1 )  
        		死にます( "dup()" );

        	/* stdin と pdes[0] は同等になりました (dup は最小のフリー記述子を返します) */

        	if (( execlp ( "program2" , "program2" , "arg1" , NULL )) == -1 )     
        		死にます( "execlp()" );

		終了( EXIT_SUCCESS );
	}
 
	0を返します 
}

void die ( const char * msg ) {    
	perror (メッセージ);
	終了( EXIT_FAILURE );
}

も参照

参考文献

  1. ^ "dup、dup2" . opengroup.org
  2. ^ "Linux マニュアル ページ" .
  • W. Richard Stevens による UNIX 環境での高度なプログラミングISBN 81-7808-096-6