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
}
"불행한"과 "Windows 전통"이 왜 그런지 궁금합니다. POSIX에서 똑같은 방식으로 작동하지만, 많은 프로그램이 이에 의존합니다 (PID 파일은이 정확한 동작에 의존하는 한 가지 예입니다). – Damon
@Damon : Windows가 "삭제"라는 용어를 사용하는 것은 불행한 일입니다. 혼란을 야기하기 때문입니다. 그들이'FILE_FLAG_UNLINK_ON_CLOSE'라고 불렀다면 혼란이 없었을 것입니다. 그렇습니다. Windows가 실제로 그렇게하는 것은 운이 좋았습니다. 일반적인 사용자 코드에 링크 해제 기능에 대한 액세스 권한을 부여하고 참조 횟수가 0으로 떨어지면 실제로 삭제하는 것이 좋습니다. –