tmpnam, tmpnam_s
|
ヘッダーで定義
<stdio.h>
|
||
|
char
*
tmpnam
(
char
*
filename
)
;
|
(1) | |
|
errno_t tmpnam_s
(
char
*
filename_s, rsize_t maxsize
)
;
|
(2) | (C11以降) |
|
#define TMP_MAX /*unspecified*/
|
||
|
#define TMP_MAX_S /*unspecified*/
|
(C11以降) | |
|
#define L_tmpnam /*unspecified*/
|
||
|
#define L_tmpnam_s /*unspecified*/
|
(C11以降) | |
-
- filename_s がnullポインタの場合
- maxsize が RSIZE_MAX より大きい場合
- maxsize が生成されるファイル名文字列より短い場合
-
すべての境界チェック付き関数と同様に、
tmpnam_sは、実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <stdio.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義している場合にのみ利用可能であることが保証される。
tmpnam および tmpnam_s は静的状態(これらの関数間で共有される可能性がある)を変更し、スレッドセーフである必要はありません。
目次 |
パラメータ
| filename | - | 結果バッファとして使用される、少なくとも L_tmpnam バイトを保持できる文字配列へのポインタ。ヌルポインタが渡された場合、内部静的バッファへのポインタが返されます。 |
| filename_s | - | 結果バッファとして使用される、少なくとも L_tmpnam_s バイトを保持できる文字配列へのポインタ。 |
| maxsize | - |
関数が書き込みを許可される最大文字数(通常は
filename_s
配列のサイズ)。
|
戻り値
注記
tmpnam
によって生成される名前は推測が困難であるものの、
tmpnam
が戻り値を返した瞬間と、プログラムがその戻り値の名前を使用してファイルを作成しようとする瞬間の間に、別のプロセスによって同じ名前のファイルが作成される可能性があります。標準関数
tmpfile
およびPOSIX関数
mkstemp
にはこの問題はありません(標準Cライブラリのみを使用して一意のディレクトリを作成する場合、依然として
tmpnam
の使用が必要です)。
POSIXシステムはさらに、同様の名前を持つ関数
tempnam
を定義しており、これはディレクトリの選択(デフォルトではオプションで定義されるマクロ
P_tmpdir
が使用される)を提供します。
例
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { // 注意: コンパイラ/リンカはセキュリティ警告を発する可能性があります(例: GCC) // "warning: the use of `tmpnam' is dangerous, better use `mkstemp'" char* name1 = tmpnam(NULL); printf("temporary file name: %s\n", name1); char name2[L_tmpnam]; if (tmpnam(name2)) printf("temporary file name: %s\n", name2); // POSIX は mkstemp を提供します。以下の宣言は、 // 標準 C <stdlib.h> に mkstemp が存在しない場合に必要になる可能性があります。 int mkstemp(char*); char name3[] = "/tmp/fileXXXXXX"; // 少なくとも6つの 'X' が必要です ^_^ int file_descriptor = mkstemp(name3); if (file_descriptor != -1) printf("temporary file name: %s\n", name3); else perror("mkstemp"); }
出力例:
temporary file name: /tmp/file90dLlR temporary file name: /tmp/fileY9LWAg temporary file name: /tmp/filexgv8PF
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 7.21.4.4 tmpnam関数 (p: TBD)
-
- K.3.5.1.2 tmpnam_s関数 (p: TBD)
- C17規格 (ISO/IEC 9899:2018):
-
- 7.21.4.4 tmpnam関数 (p: 222)
-
- K.3.5.1.2 tmpnam_s関数 (p: 427-428)
- C11標準 (ISO/IEC 9899:2011):
-
- 7.21.4.4 tmpnam関数 (p: 303-304)
-
- K.3.5.1.2 tmpnam_s関数 (p: 587-588)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.19.4.4 tmpnam関数 (p: 269-270)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.9.4.4 tmpnam関数
関連項目
|
(C11)
|
一時ファイルへのポインタを返す
(関数) |
|
C++ documentation
for
tmpnam
|
|