2

どちらの操作も空のファイルを作成し、ファイル名を返しますが、mkstemp はファイルを排他モードで開いたままにし、ハンドルを提供します。C 関数に安全上の利点はありますか? これは、コマンドライン バージョンにセキュリティ ホールがあることを意味しますか?

余談ですが、興味深いことに、Linux の C API には関連する関数がいくつかあり、それらのほとんどは、man ページで「この関数を使用しないでください」(または同様の関数) と述べています。

4

3 に答える 3

8

Unix ライクなオペレーティング システム (Linux や Mac OS を含む) での一時ファイルに関する 1 つのトリックは、ファイルを開いた直後に削除することです。ファイルにアクセスすることはできますが、他の誰もそれを見たり何かをしたりすることはできず、ファイルを閉じるとすぐに消えてしまいます。たとえプログラムが恐ろしい死を遂げたとしてもです。

于 2009-01-31T20:27:21.320 に答える
3

ソース コードから簡単にわかるようにmktemp(1)、基本的には を呼び出すだけmkstemp(3)です。

Linux の排他モードは、ファイルが既に存在する場合に関数が失敗することを意味し、ロックを保証しません。他のプロセスがこのファイルを削除し、再度作成してデータを入力することができますが、ファイル ハンドルはopen(3)自分のプロセスにあります。

コマンド ライン ユーティリティと比較して、C 関数には追加の安全性はありません。

于 2009-01-31T20:19:39.590 に答える
0

システム コールとコマンド ライン関数の最も明白な違いは、システム コールは常にプログラムによって実行されるのに対し、コマンド ライン関数はユーザーまたはそのシェル スクリプトによって使用されることです。

ファイルハンドルを人に渡すのはかなり難しいでしょう。

「安全性」に関しては、競合状態について考える必要があります。1 つのプログラムの複数のインスタンスが同時に mkstemp を呼び出しますが、それぞれに固有の一時ファイルがあることが保証されています。プログラムがシェルアウトしてコマンド ライン バージョンを呼び出した場合、これを保証することはほとんど不可能です。

于 2009-01-31T20:15:37.350 に答える