오늘도 몰랐던 것을 하나 알았습니다.
CreateProcess를 호출하고 나면, LPPROCESS_INFORMATION lpProcessInformation 에 있는 Handle 들을 닫아줘야 합니다.
이거 안 해주면... Task Manager에서 확인하면 Handle 값이 계속해서 2개씩 증가하는 것을 확인할 수 있습니다.
MSDN에 보면... 이런 글이 있습니다.
Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed.
물론, 이 CreateProcess를 호출하는 Process가 한 번 실행 되었다가 종료되면 모르지만, 계속 실행하는 Service나 기타 다른 프로그램이라면, 주의할 대목입니다.
그리고 보면, 참 생각없이 코딩했다는 생각이 드네요...
MSDN의 Sample을 볼까요?
#include <windows.h> #include <stdio.h> #include <tchar.h> void _tmain( int argc, TCHAR *argv[] ) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); if( argc != 2 ) { printf("Usage: %s [cmdline]\n", argv[0]); return; } // Start the child process. if( !CreateProcess( NULL, // No module name (use command line) argv[1], // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) // Pointer to PROCESS_INFORMATION structure ) { printf( "CreateProcess failed (%d)\n", GetLastError() ); return; } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); }
혹시, 저처럼 삽질 하셨으면... 이제 하지 마시길... ㅋㅋㅋ
'일 이야기' 카테고리의 다른 글
subversion and tags (0) | 2009.05.28 |
---|---|
회사를 다니는 목적의식이 없는 것은 아닐까.... (0) | 2008.03.18 |
꽤 쓸만한 그리드 라이브러리 Ultimate Grid (0) | 2008.02.12 |
BOOST Library 사용... (0) | 2008.01.16 |
MSDN의 틀린 문서, 그리고 삽질 (0) | 2007.12.21 |