실행 중인 실행 파일을 삭제할 수 없는 이유 [닫기]

실행 중인 실행 파일을 삭제할 수 없는 이유 [닫기]

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

관련 정보