実行中の実行可能ファイルを削除できない理由[閉じる]

実行中の実行可能ファイルを削除できない理由[閉じる]

私たちが知っているように、実行可能ファイルを実行すると、そのファイルが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まで残ります。したがって、オペレーティングシステムがプログラムを実行()すると、オペレーティングシステムはおそらく(可能性が高い)実行可能です。最後に、プログラムの実行時にファイルを削除すると、インデントなしで実行されます。unmapcloseexecmaprm


ポリスチレン mapあるいは、実行可能セグメントの完全なコピー動作も実行可能ファイルの形式によって異なります。

おすすめ記事