C言語

【C言語】dupとdup2関数、正しく理解していますか?

関数仕様

書式

 引数

oldfd 複製元のファイル記述子
newfd 複製によって新たに作るファイル記述子

戻り値

0以上の値 複製されたファイル記述子(複製に成功)
-1 エラーが発生、errno に適切に要因を設定(複製に失敗)

参考

代表的なエラー要因は EINVAL で、oldfd と newfd が同じ値であることを意味します。

 

機能

  • dup() は、ファイル記述子 oldfd の複製を作成し、最も小さい未使用のファイル記述子を返す
  • dup2() は、基本は dup() と同じですが、newfd で指定した番号のファイル記述子を返す
    既に open しているファイル記述子を指定した場合は、元の記述子は自動的に close される。

 

どのような時に使うのか?

プロセス間通信を行いたい時によく使用します。

例えば、ファイル記述子は 0=標準入力、1=標準出力、2=標準エラー出力 となっていることが一般的です。
そこに 3=プロセス間通信 というルールを設定し、以下のように子プロセスを立ち上げると、
簡単にプロセス間通信を行うことができるようになります。

関連

子プロセスを生成する fork() については、「fork関数の使い方」にまとめています。

 

注意すること

注意ポイント

dup2() の引数 newfd が指定できる範囲を超えていた場合の errno は、システムによって異なる

newfd の値が値域を超えていた場合は、EBADF を返すシステムと EINVAL を返すシステムがある。
エラー処理を行う場合は、注意が必要です。

SANACHAN
SANACHAN
使用しているシステムの man ページなどで確認しておきましょう。

 

サンプルプログラム

echo を実行し、出力内容をリダイレクトして test.txt に書き込むサンプルです。

 動作イメージ
$ echo "Hello World!" > test.txt


 実行結果確認
$ cat test.txt
Hello World!

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-, , ,