Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all
名前
tempnam - テンポラリファイルの名前を作成する
書式
#include <stdio.h> char *tempnam(const char *dir, const char *pfx); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): tempnam(): _BSD_SOURCE || _SVID_SOURCE
説明
tempnam() 関数はファイル名として正しい文字列へのポインタを返す。 このファイル名を持つファ イルは、 tempnam() がチェックした時点においては存在しない (しなかった)。 pfx が NULL でな い 5 バイト以内の文字列であれば、 生成されるパス名のうちのファイル名の部分は pfx から始ま るものになる。 生成されるディレクトリの部分は、「適切」でなければならない (大抵の場合、「 適切」であるためにはまず少なくとも 書き込み可能でなければならない)。 適切なディレクトリの探索は、以下の手順にしたがって行われる。 a) 環境変数 TMPDIR が設定されていて、 その内容が適切なディレクトリの名前なら、それを用い る。 b) それ以外の場合、 dir 引き数が NULL でない文字列でかつ適切なら、それを用いる。 c) それ以外の場合、 (<stdio.h> で定義されている) P_tmpdir が適切なら、それを用いる。 d) 最後に実装で定義されたディレクトリが用いられることになる。 tempnam() が返す文字列は malloc(3) を使って確保される。そのため、 free(3) で解放すべき である。
返り値
成功すると tempnam() 関数は、一意なテンポラリファイル名へのポインタを返す。 一意な名前が 生成できなければ NULL を返し、 errno にエラーの原因を示す値を設定する。
エラー
ENOMEM 保存領域の割り当てに失敗した。
準拠
SVr4, 4.3BSD, POSIX.1-2001. POSIX.1-2008 は tempnam() を廃止予定としている。
注意
tempnam() は推測が難しい名前を生成するが、それにもかかわらず、 tempnam() がパス名を返して から、プログラムがそのファイルをオープンする までの間に、別のプログラムが同じパス名 で、ファイルを open(2) で作成したり、シンボリックリンクを作成したりする可能性がある。 これ はセキュリティホールにつながる可能性がある。 そのような可能性を回避するためには、 open(2) の O_EXCL フラグを使ってパス名をオープンすればよい。 もっといいのは、 mkstemp(3) や tmpfile(3) を使うことである。 SUSv2 では TMPDIR に付いて言及されていない。 glibc は、プログラムが set-user-ID されていな い場合に限ってこれを用いる。 SVr4 では d) で使用されるディレクトリを /tmp と定めている (glibc もこの通りである)。 パス名を返すのに使用するメモリを動的に確保するので、 tmpnam(3) と違い、 tempnam() はリエ ントラントであり、スレッドセーフである。 tempnam() 関数は最大 TMP_MAX 回まで、呼び出される度に異なる文字列を作成する (TMP_MAX は <stdio.h> で定義されている)。 もし TMP_MAX 回以上呼び出された場合、動作は実装依存である。 tempnam() は最大で pfx の先頭 5 バイトを使用する。 他と重ならない名前が見つけられなかった場合、glibc の tempnam() の実装はエラー EEXIST で失 敗する。
バグ
「適切」という言葉の正確な意味は定義されていない。 ディレクトリに対してどの程度のアクセス 権限が必要なのかは指定されていない。 決してこの関数を使ってはならない。代わりに mkstemp(3) か tmpfile(3) を使うこと。
関連項目
mkstemp(3), mktemp(3), tmpfile(3), tmpnam(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。 2013-04-19 TEMPNAM(3)