참고 블로그
원문 : http://blog.naver.com/kater102?Redirect=Log&logNo=134098328
원격에서 프로세스를 스타트 시키는 코드를 작성한 후에 프로세스 핸들을 모니터링 해보니 계속해서 2개씩 누수가 일어나는게 아닌가...
이상하다 분명히 KillProcess 할때 해당 프로세스의 핸들은 닫아줬는데 ㅡㅡ ....
BOOL CreateProcess (
LPCTSTR IpApplicationName, // 생성할 프로세스의 실행파일 이름 argv[0]
LPSTR IpCommanLine, // 아규먼트로 넘길 값 argv[1~ 이후]
LPSECURITY_ATTRIBUTES IpProcessAttributes, // 프로세스의 보안속성을 의미하며 디폴트로 NULL
LPSECURITY_ATTRIBUTES IpThreadAttributes, // 쓰레드의 보안속성을 의미하며 디폴트로 NULL
BOOL bInheritHandles, // 전달 인자가 TRUE 이면 생성되는 자식 프로세스는 부모 프로세스가 소유하는 핸들 중 일부를 상속한다.
DWORD dwCreationFlags, // 프로세스의 특성 디폴트로 0
LPVOID IpEnvironment, // 프로세스가 환경블록을 통해 관리하는 메모리 블록에 프로세스 실행에 필요한 문자열을 저장한다.
LPCTSTR IpCurrentDirectory, // 생성하는 프로세스의 현재 디렉터리를 설정하는 인자.
LPSTARTUPINFO IpStartupInfo, // STARTUPINFO 구조체 변수는 생성하는 프로세스의 속성을 지정한다.
LPPROCESS_INFOMATION IpProcessinfomation // 프로세스 구조체 변수의 주소값을 인자로 전달, 해당 변수에 프로세스 정보가 채워짐.
);
요건 STARTUPINFO 구조체의 정보.
CreateProcess를 하게 되면 부모프로세스는 해당 함수를 사용하여 자식 프로세스를 생성하게 되는데 유닉스의 fork의 개념과 유사한 것 같다.
그리고 해당 프로세스의 정보를 담는 정보가 담겨있는 핸들이 두개 추가로 생기는데 이걸 따로 사용하지 않을꺼라면 닫아줘야 한다.
CreateProcess 할때 사용하는 PROCESS_INFORMATION에 핸들을 두개 추가로 생기게 되는데 이 핸들을 닫아주지 않으면
CreateProcess 할때마다 핸들의 Count가 2개씩 증가해서 핸들 누수가 발생할 수 있다. 따라서 일일히 닫아줘야 한다.
별도로 해당 정보를 사용하지 않을꺼라면 바로바로 닫아주자.
STARTUPINFO si;
PROCESS_INFORMATION pi;
char command_line[4096];
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
memset(&pi, 0, sizeof(pi));
sprintf(command_line, "%s %s", ProcessName, Arguments);
if(CreateProcess(NULL, command_line, NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
ProcessId = pi.dwProcessId;
ReasonCode = 0;
// 메모리 누수를 위해 CreateProcess 핸들 두개 CloseHandle 추가 - JangPD
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
}
'Coding Tip > Win Programming' 카테고리의 다른 글
CL RF 의미와 사용 (0) | 2011.07.13 |
---|