반응형


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

CR : Carriage Return
LF : Line Feed

간단하게 타자기를 생각을 하면 한글자씩 입력하면 먼지 옆으로 한칸씩 밀려나고,
한줄을 다 입력하고 나서는 그걸 왼쪽으로 밀어 주고 또 입력을 하는 것을 영화에서 봤을 것이다.

간단하게 한줄에서 왼쪽 끝으로 밀어주는것이 CR이고
다음 줄에 입력을 하도록 종이를 한줄 밀어주는것이 LF 라고 할수 있다.

어떤 연유에서 처리 방법들이 엔터를 CR+LF(\r\n)으로 처리하고
Unix/Linux계열에서는 엔터를 LF(\n)으로 처리하고
MAC 계열에서는 엔터를 CR(\r)로 처리한다고 한다.

굳이 Dos/Windows 상황에서 \r\n의 차이점을 느끼려면 파일을 읽을 때 binary모드로 읽으면
파일에 엔터가 \r\n으로 표기되지만 ASCII 모드로 읽으면 \n 으로만 표기가 되는 것을 알 수 있다.

Windows 는 개행을 carrige return 과 line feed 이 두개의 문자를 개행코드로 하고,
Unix는 line feed를 개행코드로 하며, Mac은 Carrige Return 을 개행코드로 한다

퍼온 곳 : http://seongunism.tistory.com/65
반응형

'Coding Tip > Win Programming' 카테고리의 다른 글

CreateProcess시 핸들 누수 현상  (3) 2011.08.17

+ Recent posts