2012-06-19 3 views
0

특별히 유용하지 않지만 파일이 삭제 된 후에도 페이지가 여전히 메모리에 남아 있기 때문에 다음과 같은 이유가 발생했는지 궁금합니다. 어떤 경우, 페이지가 스왑 아웃되면 데이터가 손실됩니까?FILE_FLAG_DELETE_ON_CLOSE 및 메모리 매핑 된 파일

#include <iostream> 
#include <memory> 
#include <windows.h> 

int main() 
{ 
    typedef std::unique_ptr<void, decltype(&CloseHandle)> Handle; 
    typedef std::unique_ptr<void, decltype(&UnmapViewOfFile)> View; 

    View v(nullptr, UnmapViewOfFile); 

    { 
     Handle h(CreateFile(
      L"test", 
      GENERIC_READ | GENERIC_WRITE, 
      0, 
      nullptr, 
      CREATE_ALWAYS, 
      FILE_FLAG_DELETE_ON_CLOSE, 
      nullptr 
     ), CloseHandle); 

     // write something so CreateFileMapping succeeds 
     DWORD sz; 
     WriteFile(h.get(), "hello world", 12, &sz, nullptr); 

     Handle m(CreateFileMapping(
      h.get(), 
      nullptr, 
      PAGE_READWRITE, 
      0, 0, 
      nullptr 
     ), CloseHandle); 

     v.reset(MapViewOfFile(
      m.get(), 
      FILE_MAP_WRITE, 
      0, 0, 
      0 
     )); 

     char c; 
     std::cin >> c; // File is still in folder 
    } 

    char c; 
    std::cin >> c; // No file! 

    std::cout << static_cast<char*>(v.get()); // Still writes 
} 

답변

3

FILE_FLAG_DELETE_ON_CLOSE은 "삭제"로 링크 해제 작업을 참조하는 불행한 윈도우 전통을 따른다. 사실, 플래그는 파일이 닫힐 때 파일이 지정된 디렉토리에서 링크 해제되도록 만합니다.

다른 운영 체제와 마찬가지로 Windows는 일반 사용자 코드에 특정 디렉터리의 파일 연결을 해제하는 기능 만 제공합니다. 삭제는 운영 체제의 결정으로, 파일을 더 이상 참조 할 수 없을 때 발생합니다.

실제로 파일이 디렉토리에서 연결 해제되었지만 실제로 참조 번호가 삭제 될 때까지 삭제되지는 않습니다 (데이터가 다시 사용할 수있는 디스크에 저장되는 공간). 0으로. 매핑은 참조를 보유합니다.

+0

"불행한"과 "Windows 전통"이 왜 그런지 궁금합니다. POSIX에서 똑같은 방식으로 작동하지만, 많은 프로그램이 이에 의존합니다 (PID 파일은이 정확한 동작에 의존하는 한 가지 예입니다). – Damon

+0

@Damon : Windows가 "삭제"라는 용어를 사용하는 것은 불행한 일입니다. 혼란을 야기하기 때문입니다. 그들이'FILE_FLAG_UNLINK_ON_CLOSE'라고 불렀다면 혼란이 없었을 것입니다. 그렇습니다. Windows가 실제로 그렇게하는 것은 운이 좋았습니다. 일반적인 사용자 코드에 링크 해제 기능에 대한 액세스 권한을 부여하고 참조 횟수가 0으로 떨어지면 실제로 삭제하는 것이 좋습니다. –

관련 문제