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);
}