Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       tempnam - テンポラリファイルの名前を作成する

書式

       #include <stdio.h>

       char *tempnam(const char *dir, const char *pfx);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       tempnam():
           Since glibc 2.19:
               _DEFAULT_SOURCE
           Glibc 2.19 and earlier:
               _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 保存領域の割り当てに失敗した。

属性

       この節で使用されている用語の説明については、 attributes(7) を参照。

       ┌─────────────────┬───────────────┬─────────────┐
       │インターフェース属性          │
       ├─────────────────┼───────────────┼─────────────┤
       │tempnam()        │ Thread safety │ MT-Safe env │
       └─────────────────┴───────────────┴─────────────┘

準拠

       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 プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

                                            2017-09-15                                 TEMPNAM(3)