Binary
為什麼我們不能刪除正在執行的執行檔
眾所周知,當我們執行一個執行檔時,這個文件會被載入到 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
或執行檔段的整個副本的行為也取決於執行檔的格式。