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:
댓글 달기