TMPNAM(3)

名前
tmpnam, tmpnam_r - 一時ファイルの名前を作成する

書式
#include <stdio.h>

char *tmpnam(char *s);

説明
注意: tmpnam() の使用は避けること。代わりに mkstemp(3) か tmpfile(3) を使うこと。 tmpnam() 関数は、ファイル名に使える文字列へのポインターを返す。 ある時点では同じ名前を持つファイルが存在しないファイル名が返されるので、 幼稚なプログラマはこの文字列が一時ファイルのファイル名として 適していると考えるかもしれない。 引き数 s が NULL なら、この名前は内部の静的バッファーに作成され、 次に tmpnam() 関数が呼び出された時に上書きされる。 s が NULL でなければ、ファイル名は s が指す (少なくとも L_tmpnam の長さを持つ) 文字配列にコピーされ、 成功した場合は s が返される。

作成されるパス名は、ディレクトリの部分に P_tmpdir が使われる。 (L_tmpnam と P_tmpdir は、以下で説明する TMP_MAX 同様 <stdio.h> で定義されている。)

返り値
tmpnam() 関数は一意な一時ファイル名へのポインターを返す。 一意なファイル名が作成できなかった場合は NULL を返す。

エラー
エラーは定義されていない。

属性

  マルチスレッディング (pthreads(7) 参照)
tmpnam() 関数は例外付きでスレッドセーフである。 NULL パラメーターで呼び出された場合はスレッドセーフではない。

tmpnam_r() 関数はスレッドセーフである。

準拠
SVr4, 4.3BSD, C89, C99, POSIX.1-2001. POSIX.1-2008 は tmpnam() を廃止予定としている。

注意
tmpnam() 関数は最大 TMP_MAX 回まで、呼び出される度に異なる文字列を作成する。 TMP_MAX 回以上呼び出された場合、その動作は実装依存である。

tmpnam() は推測が難しい名前を生成するが、それにもかかわらず、 tmpnam() がパス名を返してから、プログラムがそのファイルをオープンする までの間に、別のプログラムが同じパス名で、ファイルを open(2) で作成したり、シンボリックリンクを作成したりする可能性がある。 これはセキュリティホールにつながる可能性がある。 そのような可能性を回避するためには、 open(2) の O_EXCL フラグを使ってパス名をオープンすればよい。 もっといいのは、 mkstemp(3) や tmpfile(3) を使うことである。

移植性が必要な、スレッドを使ったアプリケーションでは、 _POSIX_THREADS か _POSIX_THREAD_SAFE_FUNCTIONS が定義されている場合に、 tmpnam() 関数を NULL 引き数で呼び出してはならない。

POSIX 草案では、関数 tmpnam_r() を使うことを提案している。 この関数は、以下のように定義されており、 NULL を使わないようにという警告の意味で NULL を別扱いしている。

char *
tmpnam_r(char *s)
{
    return s ? tmpnam(s) : NULL;
}

数は少ないが、この関数を実装しているシステムもある。 この関数の glibc のプロトタイプを <stdio.h> から得るには、 (「どの」ヘッダーファイルをインクルードするよりも前に) _SVID_SOURCE か _BSD_SOURCE を定義しておく必要がある。

バグ
決してこの関数を使ってはならない。代わりに mkstemp(3) か tmpfile(3) を使うこと。

関連項目
mkstemp(3), mktemp(3), tempnam(3), tmpfile(3)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。