tmpnam, tmpnam_r -
一時ファイルの名前を作成する
#include <stdio.h>
char *tmpnam(char *s);
char *tmpnam_r(char *s);
tmpnam_r()
- glibc 2.19 以降:
- _DEFAULT_SOURCE
- Up to and including glibc 2.19:
- _BSD_SOURCE || _SVID_SOURCE
注意:
これらの関数の使用は避けること。代わりに
mkstemp(3) か
tmpfile(3)
を使うこと。
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.
これらの関数は一意な一時ファイル名へのポインターを返す。
一意なファイル名が作成できなかった場合は
NULL を返す。
エラーは定義されていない。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
tmpnam() |
Thread safety |
MT-Unsafe race:tmpnam/!s |
tmpnam_r() |
Thread safety |
MT-Safe |
tmpnam(): SVr4, 4.3BSD, C89, C99, POSIX.1-2001. POSIX.1-2008 は
tmpnam()
を廃止予定としている。
tmpnam_r() is a nonstandard extension that is also available on a few
other systems.
tmpnam() 関数は最大
TMP_MAX
回まで、呼び出される度に異なる文字列を作成する。
TMP_MAX
回以上呼び出された場合、その動作は実装依存である。
これらの関数は推測が難しい名前を生成するが、それにもかかわらず、パス名が返されてから、プログラムがそのファイルをオープンするまでの間に、別のプログラムが同じパス名で、ファイルを
open(2)
で作成したり、シンボリックリンクを作成したりする可能性がある。
これはセキュリティホールにつながる可能性がある。
そのような可能性を回避するためには、
open(2) の
O_EXCL
フラグを使ってパス名をオープンすればよい。
もっといいのは、
mkstemp(3) や
tmpfile(3)
を使うことである。
移植性が必要な、スレッドを使ったアプリケーションでは、
_POSIX_THREADS か
_POSIX_THREAD_SAFE_FUNCTIONS
が定義されている場合に、
tmpnam() 関数を NULL
引数で呼び出してはならない。
決してこれらの関数を使用しないこと。代わりに
mkstemp(3) か
tmpfile(3)
を使うこと。
mkstemp(3),
mktemp(3),
tempnam(3),
tmpfile(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。