감사합니다.
콘솔 프로그램이 끝나면 핸들을 OS가 자동으로 소거해 주는 줄 알았습니다.
감사합니다.
빌더(TWx) 님이 쓰신 글 :
: 단단한돌 님이 쓰신 글 :
: : 환경: C++ Builder XE2
: :
: : CreateProcess()함수를 이용해 콘솔 프로그램을 실행 시킵니다.
: : 그런데,
: : 실행 시킬 때마다 작업관리자에서 보면 핸들이 지속적으로 증가합니다.
: : 156 => 158 => 160 => ...
: : 왜 이런 증상이 발생하나요?
: : 24시간 운영되는 S/W라 리소스 소모에 민감하네요.
: :
: : 고수님들~!
: : 미리 감사합니다.
: :
: :
void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: : bool flag;
: : STARTUPINFO si;
: : memset(&si, 0, sizeof(STARTUPINFO));
: : si.cb = sizeof(STARTUPINFO);
: : si.dwFlags = STARTF_USESTDHANDLES;
: : PROCESS_INFORMATION pi;
: :
: : UnicodeString Dir = GetCurrentDir();
: : UnicodeString File = "abcd.exe";
: : UnicodeString x = Dir + "\\" + File + " D:\\201807200120.adx";
: : AnsiString xx = x;
: :
: : flag = CreateProcess(NULL,x.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
: :
: : if(!flag) {
: : ShowMessage("Fail to create process.");
: : } else {
: : ShowMessage("Executed..");
: : }
: : }
: :
:
:
: 답변:
:
:
: OS 기초적인 부분인데...
: 프로세스를 생성했으니 당연히 프로세스 핸들이 열리게 되고...
: 모든 프로세스는 프로그램 실행을 위해 적어도 하나 이상의 쓰레드는 기본적으로 갖게 되잖아요.
:
: 아래와 같이 사용하지 않는 프로세스 핸들과 쓰레드 핸들을 닫아주면 됍니다.
:
:
: ...
: flag = CreateProcess(NULL,x.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
:
: if(!flag) {
: OutputDebugStringA("Fail to create process.");
: } else {
: // wait process termination
: WaitForSingleObject( pi.hProcess, INFINITE );
: CloseHandle(pi.hProcess);
: CloseHandle(pi.hThread);
: OutputDebugStringA("Executed..");
: }
: ...
:
:
: