名 前
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/ に 書 か れ て い る 。