C 言語の dup2 関数

胡金庫 2023年10月12日
  1. 関数 dup2 を使って C 言語でファイルディスクリプタを複製する
  2. 関数 dup を用いて C 言語でファイルディスクリプタを複製する
C 言語の dup2 関数

この記事では、C 言語で dup2 関数を使用する方法をいくつか説明します。

関数 dup2 を使って C 言語でファイルディスクリプタを複製する

ファイルは通常、open システムコールを用いてオープンした後に操作されています。成功すると、open は新たに開いたファイルに関連付けられた新しいファイルディスクリプタを返します。Unix ベースのシステムでは、オペレーティングシステムはファイルテーブルと呼ばれる、実行中の各プログラムの開いているファイルのリストを保持しています。各エントリは int 型の整数で表されています。これらの整数はこれらのシステムではファイルディスクリプタと呼ばれ、多くのシステムコールはファイルディスクリプタの値をパラメータとして受け取ります。

すべての実行中のプログラムは、明示的に閉じることを選択しない限り、プロセスが生成されたときにデフォルトで 3つのファイルディスクリプタをオープンしています。関数 dup2 は与えられたファイルディスクリプタのコピーを作成し、それに新しい整数を代入します。dup2 は、最初のパラメータとして複製される古いファイルディスクリプタを受け取り、2 番目のパラメータには新しいファイルディスクリプタの整数を指定します。その結果、これらのファイルディスクリプタはどちらも同じファイルを指しており、互換性を持って使用できます。ユーザが開いているファイルで現在使用されている整数を 2 番目のパラメータとして指定した場合、それは閉じられてからクローン化されたファイル記述子として再利用されることに注意してください。

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

extern int counter;

int main(void) {
  int fd = open("tmp.txt", O_WRONLY | O_APPEND);

  printf("tmp.txt fd = %d\n", fd);
  dup2(fd, 121);
  dprintf(121, "This string will be printed in tmp.txt file\n");

  exit(EXIT_SUCCESS);
}

出力:

tmp.txt fd = 3

上の例では、dup2 関数の基本的な使い方を示しています。ここでは、tmp.txt という名前の任意のファイルが append モードで開かれ、フォーマットされたテキストが書き込まれます。デフォルトのファイルディスクリプタは open システムコールから返される 3 です。第 2 引数に 121 を指定して dup2 関数呼び出しを実行すると、同じファイルを新しいファイルディスクリプタで指定できるようになります。これは printf 関数と似ているが、出力先を指定するファイルディスクリプタの引数が追加されていることを除けば、dprintf 関数を呼び出す。

関数 dup を用いて C 言語でファイルディスクリプタを複製する

あるいは、dup2 と同様に、dup という別の関数もファイルディスクリプタの複製を行う。しかし、dup 関数はコピーされるファイルディスクリプタの引数を 1つ取り、新しく作成されたものを自動的に返します。以下の例では、dup の使用法を示し、戻り値を int 型に格納した後、dprintf 関数を取得したファイルディスクリプタに渡す。両方の関数が正常に実行されたことを確認するためのエラーチェックルーチンを実装するのはユーザの責任であることに注意してください。具体的な詳細は dup/dup2マニュアルページを参照してください。

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

extern int counter;

int main(void) {
  int fd = open("tmp2.txt", O_WRONLY | O_APPEND);

  printf("tmp2.txt fd = %d\n", fd);
  int dup_fd = dup(fd);
  dprintf(dup_fd, "This string will be printed in tmp2.txt file\n");

  exit(EXIT_SUCCESS);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C File