![実行中の実行可能ファイルを削除できない理由[閉じる]](https://linux33.com/image/130516/%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%81%AE%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私たちが知っているように、実行可能ファイルを実行すると、そのファイルがRAMにロードされます。
rm a.exe
だから後でやってもいいと思いました./a.exe
。
実行後は./a.exe
ファイルがRAMにロードされるので、ハードドライブから削除できるようです。例を使って簡単なテストを行った。
#include <iostream>
#include <thread>
#include <chrono>
int main()
{
while (true)
{
std::cout<<"hello world"<<std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
return 0;
}
コードをコンパイルして実行してみると、何度もhello world
表示されることがわかります。
その後、実行可能ファイルを削除しましたが、引き続きhello world
表示されます。
そこで、実行ファイルの実行中に削除できると思いました。
しかし、今日は他のC ++プロジェクトで同じことをしようとしましたが、実行可能ファイルを削除した後にクラッシュしました。
なぜ?衝突の原因は何ですか?
答え1
@ctrl-alt-delorに同意します。
復元します。たぶんこれは誰かに役立つでしょう:
プログラムのロード
システムは、プロセスイメージを作成または拡張すると、ファイルセグメントを仮想メモリセグメントに論理的にコピーします。システムがファイルを物理的に読み取るタイミングと読み込みは、プログラムの実行動作、システムのロードなどによって異なります。
源泉:第3巻:オペレーティングシステム別(UNIX System Vリリース4)
したがって、プログラムをRAMに完全にロードする必要はありません。
他のプログラムでファイルを開いてマッピングしてから削除しても、プログラムの実行中にファイルにアクセスできます。これは、inodeエントリが単に削除されるために発生しますrm
が、マッピングされた()メモリを参照するファイル記述子は、そのエントリとファイル記述子がプログラムされるmap
まで残ります。したがって、オペレーティングシステムがプログラムを実行()すると、オペレーティングシステムはおそらく(可能性が高い)実行可能です。最後に、プログラムの実行時にファイルを削除すると、インデントなしで実行されます。unmap
close
exec
map
rm
ポリスチレン map
あるいは、実行可能セグメントの完全なコピー動作も実行可能ファイルの形式によって異なります。