CreatePipe에서 자식프로세스로 핸들을 상속받을 수 있도록 했다면 자식에서도 모두 파이프를 닫아줘야 할까요?

mydream의 이미지

연습용으로 파이프 프로그램 만들었습니다. 부모 프로세스가 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)에 언급됐듯이 자식프로세스에서 핸들을 또 모두 닫아줘야 하나요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.