スポンサーリンク

TMPFILE(3) FreeBSD ライブラリ関数マニュアル TMPFILE(3)

名称

tempnam, tmpfile, tmpnam − 一時ファイルルーチン

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <stdio.h>

FILE *

tmpfile(void);

char *

tmpnam(char *str);

char *

tempnam(const char *tmpdir, const char *prefix);

解説

tmpfile() 関数は、 mkstemp(3) ルーチンによって返されたファイル記述子に結 合されたストリームへのポインタを返します。作成されたファイルは tmpfile() 関数から返る前にリンクが削除されます。そのため、そのファイルへの最後の参 照が閉じられた時に、ファイルは自動的に削除されます。そのファイルは、アク セス値 ‘w+’ によって開かれます。 TMPDIR が設定されている場合、ファイル は、この環境変数によって決定されるディレクトリに作成されます。 TMPDIR が 設定されていない場合のデフォルト値は /tmp です。

tmpnam() 関数は、過去のある不特定の時点で P_tmpdir ディレクトリに存在して いたファイルを参照していたものではないファイル名へのポインタを返します。 P_tmpdir は、インクルードファイル ⟨stdio.h⟩ の中で定義されています。引数 str が NULL でない場合は、ファイル名はそれが参照するバッファにコピーされ ます。それ以外の場合は、ファイル名は静的バッファにコピーされます。どちら の場合でも、 tmpnam() 関数はそのファイル名へのポインタを返します。

str により参照されるバッファの長さは、少なくとも L_tmpnam バイトなければ なりません。 L_tmpnam は、インクルードファイル ⟨stdio.h⟩ の中で定義されて います。

tempnam() 関数は、 tmpnam() 関数と同じようなものですが、一時ファイルを収 容するディレクトリとファイル名プレフィックスを指定する機能を持っていま す。

一時ファイルを保存するディレクトリとしては、環境変数 TMPDIR (これが設定さ れている場合)、引数 tmpdir (これが NULL でない場合)、ディレクトリ P_tmpdir, ディレクトリ /tmp が、この順番で試されます。

ファイル名プレフィックスを指定するためには、値が NULL でない場合は引数 prefix が使われ、これが作成されるファイル名の最初の部分になります。 tempnam() 関数は、ファイル名を保存するメモリを割り当てます。返されたポイ ンタは、 free(3) への次に続く引数として使うことができます。

戻り値

tmpfile() 関数は、成功した場合には開いたファイルストリームへのポインタ を、エラーの場合には NULL ポインタを返します。

tmpnam() および tempfile() 関数は、成功した場合にはファイル名へのポインタ を、エラーの場合には NULL ポインタを返します。

エラー

tmpfile() 関数が失敗した場合、ライブラリ関数 fdopen(3) または mkstemp(3) で規定されるエラーのいずれかが、グローバル変数 errno に設定される場合があ ります。

tmpnam() 関数が失敗した場合、ライブラリ関数 mktemp(3) で規定されるエラー のいずれかが errno が設定される場合があります。

tempnam() 関数が失敗した場合、ライブラリ関数 malloc(3) または mktemp(3) で規定されるエラーのいずれかが errno が設定される場合があります。

関連項目

mkstemp(3), mktemp(3)

規格

tmpfile() および tmpnam() 関数は、 ISO/IEC 9899:1990 (‘‘ISO C89’’) に適合 しています。

バグ

これらのインタフェースは、System V および ANSI との互換性のみのために提供 されています。 mkstemp(3) インタフェースの使用を強く推奨します。

これらのインタフェースには (古い mktemp(3) インタフェースと同様に)、4 つ の重大な問題があります。まず第一に、ファイル名選択とファイル作成および削 除の間には明らかな競合があります。第二に、ほとんどの古いシステムでは、 ファイル名がリサイクルされるまでには、限られた数 (通常は 26) の一時ファイ ル名しか使えないことです。第三に、これらの関数 (および mktemp(3) ) の System V における実装は、一時ファイル作成の可否を決めるために access(2) 関数を用いていることです。これは、setuid および setgid プログラムに対して 明らかな問題を派生させ、このようなプログラムにこれらのインタフェースを移 植して使うことを複雑にします。最後に、一時ファイルを作成する許可に関する 指定がありません。

この実装にはこれらの欠陥はありませんが、移植可能なソフトウェアはそれを頼 りにすることはできません。特に、 tmpfile() インタフェースは、ユーザが一時 ファイルを公開して読み書き可能にすることを望まない可能性がある場合は、他 のシステム上で使用されることが予想されるソフトウェアの中では使うべきでは ありません。

FreeBSD 10.0 November 17, 1993 FreeBSD 10.0

スポンサーリンク