1

C99 標準の文言は、関数の動作に関して少しあいまいに思えremoveます。

セクション 7.19.4.1パラグラフ2:

このremove関数は、 が指す文字列を名前とするファイルに、その名前でfilename アクセスできなくなります。その名前を使用してそのファイルを開こうとすると、新しく作成されない限り失敗します。

C99標準は、remove関数がファイルシステム上のファイルを削除することを保証しますか、または実装が単にファイルを無視することができますか-ファイルシステムにファイルを残しますが、そのファイル名を介して現在のプログラムにアクセスできないだけです-プログラムの残りの部分について?

4

4 に答える 4

1

C99 標準は何も保証しません。

ファイルは、何らかの理由でunlink(2)失敗する可能性があるため、そこに残る可能性があります。たとえば、これを行う権限がありません。

すべてがうまくいかない例については、http://linux.die.net/man/2/unlinkを参照してください。

于 2013-08-07T16:37:49.810 に答える
1

Unix / Linux では、ファイルが削除されない理由がいくつかあります。

  1. ファイルのディレクトリに対する書き込み権限がありません (その場合、remove()もちろん ERROR が返されます)。
  2. ファイルには別のハード リンクがあります。その後、ファイルはディスク上に残りますが、他のパス名からのみアクセスできます
  3. ファイルはどのプロセスでも開いたままになります。その場合、ディレクトリ エントリはすぐに削除されるため、後続のopen()ユーザーはファイルにアクセスできなくなります (または、適切な呼び出しによって新しいファイルが作成されます)。ただし、ファイル自体は、プロセスがファイルを開いたままにしている限り、ディスク上に残ります。
于 2013-08-07T16:40:47.373 に答える
0

通常、これはファイル システムからファイルのリンクを解除するだけです。これは、ファイルにあったすべてのデータがまだそこにあることを意味します。十分な経験や時間があれば、誰かがそのデータを取り戻すことができるでしょう.

ファイルを二度と読み取らないようにするオプションがいくつかあります。*nix ユーティリティの shred がそれを行います。プログラム内から実行する場合は、ファイルを開いて書き込み、「削除」しようとしているものの上に無意味なデータを書き込みます。

于 2013-08-07T16:36:40.887 に答える