名 前
tempnam − テ ン ポ ラ リ フ ァ イ ル の 名 前 を 作 成 す る
書 式
#include <stdio.h>
char *tempnam(const char *dir, const char *pfx);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
tempnam(): _BSD_SOURCE || _SVID_SOURCE
説 明
決 し て こ の 関 数 を 使 用 し な い こ と 。 代 わ り に mkstemp(3) か tmpfile(3) を 使 う こ と 。
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), mktemp(3), tmpfile(3), tmpnam(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。