11

一時ファイルを使用する必要があるプログラムを C で作成しているとしましょう。/tmp に一時的な一時ファイルを作成することは、おそらく良い考えではありません。一時ファイル名を提供して、そこから書き込みおよび読み取りを開始できる関数または OS 呼び出しはありますか?

4

7 に答える 7

20

mkstemp(3)この目的のために関数を使用できます。別の選択肢はtmpfile(3)関数です。どちらを選択するかは、ファイルを C ライブラリ ファイル ストリームとして開くか (そうするかtmpfile)、直接ファイル記述子として開くか ( mkstemp) によって異なります。プログラムが終了すると、このtmpfile関数はファイルを自動的に削除します。

これらの関数を使用する利点は、一意のファイル名の決定とファイルの作成の間の競合状態を回避できることです。たとえば、2 つのプログラムが同時に同じファイルを作成しようとすることはありません。

詳細については、両方の関数のマニュアル ページを参照してください。

于 2008-08-27T07:12:14.470 に答える
5

問題は、一時ファイルを生成する方法です。mkstemp も tmpfile も呼び出し元に名前を提供せず、それぞれファイル記述子またはファイル ハンドルを返します。

于 2008-08-28T03:07:03.507 に答える
3

@ガレスム:

あなたが探している関数は tmpnam と呼ばれるものだと思います。

は絶対に使用しないtmpnamでください。私の回答で述べた競合状態の問題に苦しんでいます。名前を決定してから開くまでの間に、別のプログラムがファイルまたはそのシンボリックリンクを作成する可能性があり、これは巨大なセキュリティホールです。

マニュアルページではtmpnam、それを使用するのではなく、代わりにmkstemporを使用するように具体的に述べていtmpfileます。

于 2008-08-27T07:56:09.153 に答える
2

絶対に: man mkstemp.

man ページには使用例があります。

于 2008-08-27T07:12:52.690 に答える
1

C lib については何もわかりませんが、シェルでmktempを使用してこれを行うことができます。

于 2008-08-27T07:13:58.820 に答える
0

これは推奨される関数であるため、mkstemp() を使用する必要がありますが、ファイル記述子を返すため、記述子を取得したらその名前を取得します。

int fd;
fd = mkstemp("hdrXXXXXX);
/* Read out the link to our file descriptor. */
sprintf(path, "/proc/self/fd/%d", fd);
memset(result, 0, sizeof(result));
readlink(path, result, sizeof(result)-1);

/* Print the result. */
printf("%s\n", result);
于 2016-05-31T10:17:37.407 に答える