tmpnam, tmpnam_s
From cppreference.com
| ヘッダー <stdio.h> で定義 |
||
| char *tmpnam( char *filename ); |
(1) | |
| errno_t tmpnam_s(char *filename_s, rsize_t maxsize); |
(2) | (C11 以降) |
| #define TMP_MAX /*未定義*/ |
||
| #define TMP_MAX_S /*未定義*/ |
(C11 以降) | |
| #define L_tmpnam /*未定義*/ |
||
| #define L_tmpnam_s /*未定義*/ |
(C11 以降) | |
1) filename が指す文字配列に、L_tmpnam 以下の長さの、一意な有効なファイル名を生成して格納します。この関数は最大 TMP_MAX 個の一意なファイル名を生成できますが、そのうちのいくつかはファイルシステムで使用中である可能性があり、返り値として不適切かもしれません。
2) (1) と同様ですが、最大 TMP_MAX_S 個の名前が生成され、長さは L_tmpnam_s 以下です。また、実行時に以下のエラーが検出され、現在インストールされている 制約ハンドラ 関数が呼び出されます。
- filename_s がヌルポインタ
- 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 配列のサイズ)。 |
[編集] 戻り値
1) filename がヌルポインタでなかった場合は filename。それ以外の場合は、内部の静的バッファへのポインタが返されます。適切なファイル名が生成できなかった場合は、ヌルポインタが返されます。
2) 成功した場合はゼロを返し、ファイル名を filename_s に書き込みます。エラーの場合は、ゼロ以外を返し、ヌル文字を filename_s[0] に書き込みます(filename_s がヌルでなく、maxsize がゼロでなく、かつ RSIZE_MAX より大きくない場合に限ります)。
[編集] 注意
tmpnam によって生成される名前は推測が困難ですが、プログラムが返された名前を使用してファイルを作成しようとする瞬間と、別のプロセスがその名前のファイルを作成する瞬間との間に、その名前のファイルが作成される可能性があります。標準関数 tmpfile および POSIX 関数 mkstemp はこの問題がありません(標準 C ライブラリのみを使用して一意なディレクトリを作成するには、依然として tmpnam の使用が必要です)。
POSIX システムでは、同様の名前の関数 tempnam も定義されています。これはディレクトリの選択肢を提供します(デフォルトはオプションで定義されるマクロ P_tmpdir です)。
[編集] 例
このコードを実行
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { // Note, the compiler/linker may issue a security warning, e.g. 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 offers mkstemp. The following declaration might be // necessary as mkstemp is absent in the standard C <stdlib.h>. int mkstemp(char*); char name3[] = "/tmp/fileXXXXXX"; // at least six 'X' required ^_^ 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 The tmpnam function (p: TBD)
- K.3.5.1.2 The tmpnam_s function (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.21.4.4 The tmpnam function (p: 222)
- K.3.5.1.2 The tmpnam_s function (p: 427-428)
- C11標準 (ISO/IEC 9899:2011)
- 7.21.4.4 The tmpnam function (p: 303-304)
- K.3.5.1.2 The tmpnam_s function (p: 587-588)
- C99標準 (ISO/IEC 9899:1999)
- 7.19.4.4 The tmpnam function (p: 269-270)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.9.4.4 The tmpnam function
[編集] 関連項目
| (C11) |
一時ファイルを返します (関数) |
| tmpnam の (C++ ドキュメント)
| |