Binary

為什麼我們不能刪除正在執行的執行檔

  • March 31, 2018

眾所周知,當我們執行一個執行檔時,這個文件會被載入到 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++ 項目做同樣的事情,在我刪除執行檔後,它崩潰了。

為什麼?哪種原因會導致崩潰?

同意@ctrl-alt-delor。

我恢復它。也許它會對某人有所幫助:

程序載入

當系統創建或擴充程序映像時,它會在邏輯上將文件段複製到虛擬記憶體段。系統何時(以及是否)物理讀取文件取決於程序的執行行為、系統負載等。

資料來源:第三冊:作業系統特定(UNIX System V 第 4 版)

因此,程序沒有必要完全載入到 RAM 中。


當某些文件在其他程序打開並映射後將被刪除時,該文件將在程序執行時始終可以訪問。發生這種情況是因為rm僅刪除 inode 條目,但引用映射 ( map) 記憶體的文件描述符將一直存在,直到unmap對其和close文件描述符進行程式。因此,如果作業系統執行(exec)某個程序,那麼作業系統可能(更有可能)map執行檔。最後,在程序執行時刪除文件rm在執行時沒有縮進。


PS map或執行檔段的整個副本的行為也取決於執行檔的格式。

引用自:https://unix.stackexchange.com/questions/434458