TMPFILE(3) | FreeBSD Library Functions Manual | TMPFILE(3) |
名称
tempnam, tmpfile, tmpnam — 一時ファイルルーチンライブラリ
Standard C Library (libc, -lc)書式
#include < stdio.h> FILE *
tmpfile( void);
char *
tmpnam( char *str);
char *
tempnam( const char *tmpdir, const char *prefix);
解説
tmpfile() 関数は、ルーチン mkstemp(3) によって返されたファイル記述子に関連するストリームへのポインタを返します。作成されたファイルは tmpfile() から返る前にリンクが削除され、そのため、そのファイルへの最後の参照がクローズされた時に、ファイルは自動的に削除されます。ファイルは、アクセス値‘w+
’でオープンされます。ファイルは環境変数
TMPDIR が設定されていれば、それによって決定されるディレクトリに作成されます。
TMPDIR が設定されていない場合のデフォルト位置は
/tmp です。
tmpnam() 関数は、過去のある不定の時点で存在していたファイルを参照していなかった、 P_tmpdir ディレクトリ中のファイル名へのポインタを返します。 P_tmpdir は、インクルードファイル < stdio.h> で定義されています。引数 str が NULL でない場合は、ファイル名はそれが参照するバッファにコピーされます。そうでなければ、ファイル名は静的バッファにコピーされます。いずれの場合も、 tmpnam() はそのファイル名へのポインタを返します。
str で参照されるバッファは、少なくとも L_tmpnam バイトの長さが求められます。 L_tmpnam は、インクルードファイル < stdio.h> で定義されています。
tempnam() 関数は、 tmpnam() に似ていますが、一時ファイルを含むディレクトリとファイル名の接頭辞 (プレフィックス) を指定する能力を提供しています。
一時ファイルを格納するディレクトリとして、(設定されているなら) 環境変数 TMPDIR、 ( NULL でなければ) 引数 tmpdir、ディレクトリ P_tmpdir、ディレクトリ /tmp が、この一覧の順番で試みられます。
引数 prefix が NULL でなければ、ファイル名接頭辞を指定するために使われ、ファイル名が作成される最初の部分になります。 tempnam() 関数は、ファイル名を格納するためにメモリを割り付けます。返されたポインタは、後で、 free(3) の引数として使うことができます。
戻り値
tmpfile() 関数は、成功した場合オープンしたファイルストリームへのポインタを返します。エラーの場合には NULL ポインタを返します。tmpnam() と tempfile() 関数は、成功した場合にはファイル名へのポインタを返します。エラーの場合には NULL ポインタを返します。
環境変数
- TMPDIR
- [ tempnam() のみ] 設定されるなら、一時ファイルが格納されるディレクトリです。 TMPDIR は、 issetugid(2) が真であるプロセスでは無視されます。
互換性
これらのインタフェースは System V と ANSI の互換性のみから規定されます。これらの関数のほとんどの歴史的な実装では、ファイル名が再利用され始める前にあり得る一時ファイル名の限定された数 (通常 26) のみ提供します。これらの関数 (と mktemp(3)) の System V の実装は、一時ファイルを作成するかどうかを決定するために access(2) システムコールを使用します。これは、setuid か setgid プログラムのための明らかな問題を派生させ、このようなプログラムにこれらのインタフェースを移植して使うことを複雑にします。
tmpfile() インタフェースは、ユーザが一時ファイルを公開して読み書き可能にすることを望まない可能性がある場合は、他のシステムで使用されることが予想されるソフトウェアで使うべきではありません。
エラー
tmpfile() 関数が失敗した場合、ライブラリ関数 fdopen(3) または mkstemp(3) で明記されたエラーのいずれかが、グローバル変数 errno に設定されます。tmpnam() 関数が失敗した場合、ライブラリ関数 mktemp(3) で明記されたエラーのいずれかが errno に設定されます。
tempnam() 関数が失敗した場合、ライブラリ関数 malloc(3) または mktemp(3) で明記されたエラーのいずれかが errno に設定されます。
規格
tmpfile() と tmpnam() 関数は、 ISO/IEC 9899:1990 (“ISO C90”) に適合しています。セキュリティの考察
tmpnam() と tempnam() 関数は実行プログラムの特権のレベルによって、悪意があるユーザがシステムで任意のファイルを潜在的に上書きするのを許す、ファイル名の選択とファイルの作成の間に起こる競合条件に影響を受けやすいです。さらに、ファイルのパーミッション (許可) を指定する手段はありません。 mkstemp(3) がこれらの関数の代わりに使用するのを強くお勧めします。 (FSA を参照。)March 18, 2007 | FreeBSD |