MKSTEMP(3)

名前
mkstemp, mkostemp, mkstemps, mkostemps - 他と重ならない名前を持つ一時ファイルを作成する

書式
#include <stdlib.h>

int mkstemp(char *template);

int mkostemp(char *template, int flags);

int mkstemps(char *template, int suffixlen);

int mkostemps(char *template, int suffixlen, int flags);

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

mkstemp():
    _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
    || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200112L

mkostemp(): _GNU_SOURCE
mkstemps(): _BSD_SOURCE || _SVID_SOURCE
mkostemps(): _GNU_SOURCE

説明
関数 mkstemp() は引数 template から他と重ならない一時ファイル名を生成し、 そのファイルの作成とオープンを行い、 そのファイルに対するオープン済みのファイルディスクリプタを返す。 引数 template で指示する文字列の後ろの 6 文字は XXXXXX である必要がある。 この部分がファイル名を他と重ならないようにする文字で置き換えられる。 template は書き換えられるため、文字列定数ではなく文字配列として 宣言するようにしなければならない。 ファイルは許可モード 0600 で作成され、所有者のみが読み書き可能である。返されるファイルディスクリプタで、このファイルへの読み書き両方のアクセスが 可能である。 呼び出し者がそのファイルを作成するプロセスであることを保証するために、 ファイルは open(2) の O_EXCL フラグ付きでオープンされる。 mkostemp() 関数は mkstemp() と同様だが、open(2) に渡される フラグ O_APPEND, O_SYNC など) を flags で指定できる点が異なる mkstemps() 関数は mkstemp() と同様だが、 template 内の文字列に長さ が suffixlen 文字の接尾辞 (suffix) が含まれる点が異なる。 したがって、 template は prefixXXXXXXsuffix の形式となる。 文字列 XXXXXX の部分は mkstemp() により更新される。 mkostemps() と mkstemps() の関係は、 mkostemp() と mkstemp() の関係と同じである。

返り値
成功すると、これらの関数は一時ファイルのファイルディスクリプタを返す。 エラーの場合は、-1 を返し、 errno を適切に設定する。

エラー

EEXIST
    すでに同じ名前を持つファイルが存在した。 template の内容は不定である。

EINVAL
    mkstemp() と mkostemp() の場合: template の最後の 6 文字が XXXXXX でなかった。 この場合、template は変更されない。

    mkstemps() と mkostemps() の場合: template の長さが (6 + suffixlen) 文字より短い、または template の接尾辞の直前の 6 文字が XXXXXX ではなかった。

これらの関数は open(2) に書かれているエラーのいずれかで失敗することもある。

バージョン
mkostemp() は glibc 2.7 以降で利用できる。 mkstemps() と mkostemps() は glibc 2.11 以降で利用できる。

準拠
mkstemp(): 4.3BSD, POSIX.1-2001. mkstemps(): 標準化されていないが、他のいくつかのシステムにも存在する。 mkostemp() と mkostemps(): glibc による拡張。

注意
glibc バージョン 2.06 以前では、ファイルは許可モード 0666 で作成され、全てのユーザが読み書き可能であった。この古い動作は、 セキュリティ上のリスクになり得る。特に、他の UNIX では許可モードとして 0600 を使うため、プログラムを移植する際、この細かな違いを見落とす可能性があるからだ。 POSIX.1-2008 では、ファイルを許可モード 0600 で作成することが必須要件として追加された。 より一般的には、 mkstemp() の POSIX 規定ではファイルモードについて何も述べていない。 従って、アプリケーションは mkstemp() (や mkostemp()) を呼び出す前にファイルモード生成マスク (umask(2) 参照) が適切に設定されているか確認するべきである。 mktemp() のプロトタイプ宣言は、libc4, libc5, glibc1 では <unistd.h> に含まれる; glibc2 では POSIX.1 に準拠し <stdlib.h> に含まれている。

関連項目
mkdtemp(3), mktemp(3), tempnam(3), tmpfile(3), tmpnam(3)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。