#include <stdio.h> char *tmpnam(char *s); char *tmpnam_r(char *s);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
tmpnam_r()
tmpnam() 関数は、ファイル名に使える文字列へのポインターを返す。 ある時点では同じ名前を持つファイルが存在しないファイル名が返されるので、 幼稚なプログラマはこの文字列が一時ファイルのファイル名として 適していると考えるかもしれない。 引数 s が NULL なら、この名前は内部の静的バッファーに作成され、 次に tmpnam() 関数が呼び出された時に上書きされる。 s が NULL でなければ、ファイル名は s が指す (少なくとも L_tmpnam の長さを持つ) 文字配列にコピーされ、 成功した場合は s が返される。
作成されるパス名は、ディレクトリの部分に P_tmpdir が使われる。 (L_tmpnam と P_tmpdir は、以下で説明する TMP_MAX 同様 <stdio.h> で定義されている。)
The tmpnam_r() function performs the same task as tmpnam(), but returns NULL (to indicate an error) if s is NULL.
インターフェース | 属性 | 値 |
tmpnam() | Thread safety | MT-Unsafe race:tmpnam/!s |
tmpnam_r() | Thread safety | MT-Safe |
tmpnam_r() is a nonstandard extension that is also available on a few other systems.
これらの関数は推測が難しい名前を生成するが、それにもかかわらず、パス名が返されてから、プログラムがそのファイルをオープンするまでの間に、別のプログラムが同じパス名で、ファイルを open(2) で作成したり、シンボリックリンクを作成したりする可能性がある。 これはセキュリティホールにつながる可能性がある。 そのような可能性を回避するためには、 open(2) の O_EXCL フラグを使ってパス名をオープンすればよい。 もっといいのは、 mkstemp(3) や tmpfile(3) を使うことである。
移植性が必要な、スレッドを使ったアプリケーションでは、 _POSIX_THREADS か _POSIX_THREAD_SAFE_FUNCTIONS が定義されている場合に、 tmpnam() 関数を NULL 引数で呼び出してはならない。