名称
tmpnam(), tempnam() ― 一時ファイルの名前の作成
構文
#include <stdio.h>
char *tmpnam(char *s);
char *tempnam(const char *dir, const char *pfx);
説明
tmpnam() と tempnam() は、一時ファイル用に安全に使えるファイル名を生成します。
| tmpnam() | | 常にヘッダーファイル <stdio.h>
内で、 P_tmpdir として定義されているパス接頭辞を使ってファイル名を生成します。 s が NULL の時、 tmpnam() は生成した名前を内部静的領域に残し、その領域へのポインターを返します。
次に tmpnam() を呼び出したとき、その領域の内容は上書きされてしまいます。 s が NULL ではないとき、その値は少なくとも L_tmpnam バイトの大きさの配列のアドレスであるとみなされます。 L_tmpnam は <stdio.h>
に定義されている定数です。 tmpnam() は生成した値を配列に書き込み、 s を返します。 マルチスレッドアプリケーションでは、 s が NULL ポインターの場合、処理が実行されず、 NULL
ポインターが返されます。 |
| tempnam() | | この関数を使って、ユーザーはディレクトリの選択を制御できます。 引き数 dir は、ファイルが生成されるディレクトリ名を指します。 dir が NULL の時、もしくは適切なディレクトリ名を示す文字列を指していないとき、
ヘッダーファイル <stdio.h> 内の P_tmpdir として定義されているパス接頭辞が用いられます。
指定されたディレクトリがアクセスできない場合、最後の手段として /tmp が使われます。
特定の一時ファイルディレクトリの名前を値として持つ 環境変数 TMPDIR をユーザーの環境内に指定して、
この一連の手順を省略できます。 |
tempnam() または tmpnam() をデフォルトで動作させるには、 tempnam() の場合は dir と pfx に、 tmpnam() の場合は s に NULL の値を渡す必要があります。 有効な値が渡されない場合には、動作は不定となります。
一時ファイルの名前として、先頭の何文字かを特定の文字で統一しているアプリケーションがよくあります。
指定した接頭辞を定義するには引き数 pfx を使ってください。 その引き数は、 NULL または 5 文字までの文字列を示し、一時ファイル名の先頭部分として使われます。
tempnam() は、生成されたファイル名用に malloc() malloc(3C) を参照) を使って空き領域を確保し、この領域へのポインターを返します。
したがって tempnam() から返されるポインターの値は、必ず free() malloc(3C) を参照) の引き数として使えます。 tempnam() が何らかの理由で期待した結果を返せない場合、つまり malloc() の処理が失敗するか、あるいは適切なディレクトリが前述の手順によって求められなかった場合、
NULL ポインターが返されます。
注意
tmpnam() と tempnam() は、複数回呼び出すとそのたびに違ったファイル名を生成します。
しかし、単独のプロセスで TMP_MAX の回数より多く呼び出しが行われた場合、一度使った名前を再利用し始めます。
これらの関数および fopen() もしくは creat() fopen(3S) および creat(2) を参照) を使って作成したファイルは、一時的に使うためのディレクトリ内に存在するという意味においてのみ一時ファイルであり、ファイル名は一意です。
ユーザーは、作成したファイルが必要でなくなったとき、 unlink(2) を使ってそのファイルを削除しなければなりません。
警告
ファイル名が生成されてからそのファイルがオープンされるまでの間に、
別のプロセスがそれと同じ名前を持つファイルを 作成する可能性があります。
ただし、別のプロセスでもこれらの関数や mktemp を使っている場合には、重複しないようにファイル名が選ばれるので、
そのような同一のファイル名の生成はありません。
標準準拠
tmpnam(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C
tempnam(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4