CreatePipe에서 자식프로세스로 핸들을 상속받을 수 있도록 했다면 자식에서도 모두 파이프를 닫아줘야 할까요?
글쓴이: mydream / 작성시간: 수, 2016/06/08 - 3:17오후
연습용으로 파이프 프로그램 만들었습니다. 부모 프로세스가 CreatePipe로 한 쌍의 파이프를 만들고 읽기용 파이프를 자식으로 전달했습니다. 한 쌍의 파이프가 모두 상속가능하기 때문에 자식에서도 CloseHandle로 닫아주지 않으면 메모리 누수가 발생하지 않을까요?
-send.cpp-
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdline, int nShowCmd) {
HWND hwnd=CreateWindow(~);
ShowWindow(hwnd, nShowCmd);
SendMessage(hwnd, WM_APP, 0, 0);
//이하 메시지 루프
}
HANDLE writeHandle, readHandle;
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
switch(message) {
case WM_CREATE:
return 0;
case WM_APP:
{
SECURITY_ATTRIBUTES sec;
sec.nLength=sizeof(sec);
sec.lpSecurityDescriptor=NULL;
sec.bInheritHandle=TRUE;
BOOL bPipe=CreatePipe(&readHandle, &writeHandle, &sec, 0);
if(!bPipe) MessageBox(hwnd, TEXT("CreatePipe's returned 0."), TEXT("error"), MB_OK);
HDC hdc=GetDC(hwnd);
TCHAR handlebuffer[1024];
//_stprintf(handlebuffer, TEXT("readHandle is %u"), readHandle);
//TextOut(hdc, 10, 70, handlebuffer, _tcslen(handlebuffer));
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb=sizeof(si);
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
TCHAR command[1024];
memset(command, 0, sizeof(command));
_stprintf(command, TEXT("recv %u %u"), readHandle, writeHandle);
if(!CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
MessageBox(hwnd, TEXT("CreateProcess's returned 0."), TEXT("error"), MB_OK);
}
TCHAR wbuffer[1024];
memset(wbuffer, 0, sizeof(wbuffer));
_stprintf(wbuffer, TEXT("%s"), TEXT("testing..."));
DWORD bytes;
while(!WriteFile(writeHandle, wbuffer, (_tcslen(wbuffer)+1)*sizeof(TCHAR), &bytes, NULL)) {
//WriteFile(writeHandle, wbuffer, (_tcslen(wbuffer)+1)*sizeof(TCHAR), &bytes, NULL);
//if(bytes>0) break;
//MessageBox(hwnd, TEXT("CreateProcess's returned 0."), TEXT("error"), MB_OK);
}
TextOut(hdc, 10, 90, command, _tcslen(command));
ReleaseDC(hwnd, hdc);
CloseHandle(readHandle);
CloseHandle(writeHandle);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wparam, lparam);
}
-recv.cpp-
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdline, int nShowCmd) {
HWND hwnd=CreateWindow(~);
ShowWindow(hwnd, nShowCmd);
//메시지 루프
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
switch(message) {
case WM_CREATE:
return 0;
case WM_APP:
{
TCHAR* cmdline=GetCommandLine();
TCHAR* handle_add=_tcschr(cmdline, TEXT(' '));
++handle_add;
HANDLE readHandle;
#ifdef UNICODE
readHandle=(HANDLE)_wtoi(handle_add);
#else
readHandle=(HANDLE)atoi(handle_add);
#endif
handle_add=_tcschr(handle_add, TEXT(' '));
++handle_add;
HANDLE writeHandle;
#ifdef UNICODE
writeHandle=(HANDLE)_wtoi(handle_add);
#else
writeHandle=(HANDLE)atoi(handle_add);
#endif
TCHAR rbuffer[1024];
memset(rbuffer, 0, sizeof(rbuffer));
DWORD bytes;
while(!ReadFile(readHandle, rbuffer, sizeof(rbuffer), &bytes, NULL)) { }
HDC hdc=GetDC(hwnd);
TextOut(hdc, 10, 10, cmdline, _tcslen(cmdline));
TextOut(hdc, 10, 30, rbuffer, _tcslen(rbuffer));
ReleaseDC(hwnd, hdc);
CloseHandle(readHandle);//1)
CloseHandle(writeHandle);//2)
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wparam, lparam);
}부모에서 핸들을 닫아줬는데 1), 2)에 언급됐듯이 자식프로세스에서 핸들을 또 모두 닫아줘야 하나요?
Forums:


댓글 달기