総合手引 | セクション 3 | English | オプション |
#include <stdio.h>
tmpnam() 関数は、過去のある不特定の時点で P_tmpdir ディレクトリに存在していたファイルを参照していたものではない ファイル名へのポインタを返します。 P_tmpdir は、インクルードファイル < stdio.h> の中で定義されています。 引数 str が NULL でない場合は、ファイル名はそれが参照するバッファにコピーされます。 それ以外の場合は、ファイル名は静的バッファにコピーされます。 どちらの場合でも、 tmpnam() 関数はそのファイル名へのポインタを返します。
str により参照されるバッファの長さは、少なくとも L_tmpnam バイトなければなりません。 L_tmpnam は、インクルードファイル < stdio.h> の中で定義されています。
tempnam() 関数は、 tmpnam() 関数と同じようなものですが、一時ファイルを収容するディレクトリと ファイル名プレフィックスを指定する機能を持っています。
一時ファイルを保存するディレクトリとしては、環境変数 TMPDIR (これが設定されている場合)、引数 tmpdir (これが NULL でない場合)、ディレクトリ P_tmpdir, ディレクトリ /tmp が、この順番で試されます。
ファイル名プレフィックスを指定するためには、値が NULL でない場合は引数 prefix が使われ、これが作成されるファイル名の最初の部分になります。 tempnam() 関数は、ファイル名を保存するメモリを割り当てます。 返されたポインタは、 free(3) への次に続く引数として使うことができます。
tmpnam() および tempfile() 関数は、成功した場合にはファイル名へのポインタを、 エラーの場合には NULL ポインタを返します。
tmpnam() 関数が失敗した場合、ライブラリ関数 mktemp(3) で規定されるエラーのいずれかが errno が設定される場合があります。
tempnam() 関数が失敗した場合、ライブラリ関数 malloc(3) または mktemp(3) で規定されるエラーのいずれかが errno が設定される場合があります。
これらのインタフェースには (古い mktemp(3) インタフェースと同様に)、4 つの重大な問題があります。 まず第一に、ファイル名選択とファイル作成および削除の間には 明らかな競合があります。 第二に、ほとんどの古いシステムでは、ファイル名がリサイクルされるまでには、 限られた数 (通常は 26) の一時ファイル名しか使えないことです。 第三に、これらの関数 (および mktemp(3) ) の System V における実装は、一時ファイル作成の可否を決めるために access(2) 関数を用いていることです。 これは、setuid および setgid プログラムに対して 明らかな問題を派生させ、このようなプログラムにこれらの インタフェースを移植して使うことを複雑にします。 最後に、一時ファイルを作成する許可に関する指定がありません。
この実装にはこれらの欠陥はありませんが、移植可能な ソフトウェアはそれを頼りにすることはできません。 特に、 tmpfile() インタフェースは、ユーザが一時ファイルを公開して読み書き可能にすることを 望まない可能性がある場合は、他のシステム上で使用されることが予想される ソフトウェアの中では使うべきではありません。
TMPFILE (3) | November 17, 1993 |
総合手引 | セクション 3 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | If you sat a monkey down in front of a keyboard, the first thing typed would be a unix command. | ” |
— Bill Lye |