CloseHandle에 대한 의문점
글쓴이: BrownBear / 작성시간: 목, 2016/01/21 - 3:32오후
#include <windows.h> #include <stdio.h> int main(int argc, wchar_t** argv) { HANDLE CurrentHandle = GetCurrentProcess(); HANDLE NextHandle = CurrentHandle; CloseHandle(CurrentHandle); CloseHandle(NextHandle); IO_COUNTERS Value; if(GetProcessIoCounters(NextHandle, &Value)) { printf("RESULT : %llu\n", Value.OtherOperationCount); system("pause"); } return 0; }
위의 코드가 왜 작동하는거죠?
CloseHandle를 통해 핸들을 닫았음에도 불구하고 정상적으로 함수가 작동하는데 어째서 그런건지 궁금하네요.
GetLastError을 호출해봐도 0으로 나오는데
CloseHandle가 효력이 없는건지...
*추가적으로 핸들을 복제할때 위와 같은 방식으로 써도되는거 같은데.. 굳이 DuplicateHandle을 쓰는이유가 있는건지 궁금하네요.
Forums:
https://msdn.microsoft.com/ko
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms683179(v=vs.85).aspx
요약하자면, GetCurrentProcess 함수는 가짜 핸들(pseudo handle) -1을 반환합니다. 이 핸들 값은 현재 프로세스를 가리키는 일종의 매직 넘버죠.
이 가짜 핸들은 필요 없어져도 닫을 필요가 없으며, CloseHandle로 넘겨 봤자 아무 효과도 없다고 하네요.
여담으로, 가짜 핸들을 DuplicateHandle로 넘겨서 받은 복제본은 진짜 핸들이며, 이건 꼭 닫아줘야 한다고 합니다.
더 짧게 요약하면, GetCurrentProcess 함수가 반환하는 핸들만 이렇습니다. 다른 (진짜) 핸들은 닫고 나면 쓸 수 없습니다.
어? 음
정말 감사드립니다.
궁금한점이 시원하게 해소가 되었네요.
앞으로는 상세하게 읽어보고 질문을 드려야겠네요.
기분좋은 하루되세요~
댓글 달기