Namespaces
Variants

tmpnam, tmpnam_s

From cppreference.net
< c ‎ | io
ヘッダーで定義 <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以降)
1) 一意の有効なファイル名(長さは L_tmpnam 以下)を作成し、 filename が指す文字列に格納します。この関数は最大 TMP_MAX 個の一意のファイル名を生成できますが、一部または全てがファイルシステムで既に使用中である可能性があり、その場合は適切な戻り値とはなりません。
2) (1) と同様だが、最大 TMP_MAX_S 個の名前が生成可能で、長さは L_tmpnam_s 以下となる。また、以下のエラーが実行時に検出され、現在インストールされている constraint handler 関数が呼び出される:
  • 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 配列のサイズ)。

戻り値

1) filename filename が null ポインタでない場合。それ以外の場合、内部静的バッファへのポインタが返される。適切なファイル名を生成できない場合、null ポインタが返される。
2) 成功時はゼロを返し、ファイル名を filename_s に書き込む。エラー時は非ゼロを返し、null文字を filename_s [ 0 ] に書き込む( filename_s がnullでなく、 maxsize がゼロでなく RSIZE_MAX を超えない場合のみ)。

注記

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関数

関連項目

一時ファイルへのポインタを返す
(関数)