반응형


참고 블로그
원문 : 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

+ Recent posts