우리 모두 알고 있듯이 실행 파일을 실행하면 해당 파일이 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
또는 실행 가능 세그먼트의 전체 복사 동작도 실행 파일 형식에 따라 달라집니다.