버그 해결을 위한 모든 질문을 던져
+2 votes
369 views

다음은 프로세스의 종료를 기다렸다가 파일을 삭제 하는 루틴입니다.

프로세스가 종료 되었는지를 위해 WaitForSingleObject() 함수 통과 후 바로 파일 삭제를 시도하니

약간의 시간차?에 의해 파일 삭제가 성공할 때도 있고 실패할 때도 있더군요.

물론 중간에 Sleep() 을 주면 확실히 삭제가 되는것을 확인했지만,

코드상 의도 했던것과는 다르다고 생각됩니다.

어떤 문제가 있는 것인가요 ?

HANDLE hProcess = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, dwProcessID );
if( hProcess != NULL )
{
    WaitForSingleObject( hProcess, INFINITE );
    CloseHandle( hProcess );
}

DeleteFile( "test.exe" );

(http://www.gpgstudy.com/forum/viewtopic.php?f=8&t=20896 에서 발췌 :  throw bug 활성화에 도움이 될까 해서, 종종 GpgStudy 포럼의 기존 질답 글 중 재미있는 또는 좀 더 논의할 만한 글을 옮기려 합니다.  자신의 기존 질문이 노출되는 것을 원치 않는 분도 있을 것 같아서 저자를 확인할 수 없는 비회원 글 위주로 진행할 계획입니다. 도와 주실 분 환영합니다!)

asked (72 point)
재 태그 , 369 views
서버 프로그래밍 공부하는 학생입니다. 궁금해서 테스트해보았는데 제 환경(Windows10 / Visual Studio 2017) 에서는 몇번을 테스트해봐도 아무런 문제가 없네요 ㅠㅠ GetLastError() 코드라도 있으면 좋겠네요. 고수분들의 답변 기다립니다!

2 answers

+2 votes
우수 답변

글쎄요. 간단하게 테스트 해 봤을 때는 그런 현상이 나지 않는데요.

백신이 프로세스를 잡고 있어서?

메모리를 굉장히 많이 사용하는 프로세스라 작동 중 페이지폴트가 발생해서, 프로세스 종료시 메모리를 정리하는데 오래 걸려서?

원인은 정확히 모르겠지만, 파일 삭제가 꼭 필요하다면 대략 다음과 같이 해보는 게 어떨까요?

	int iRetry = 10;
	while (0 < iRetry--)
	{
		if (DeleteFile("test.exe"))
		{
			break;
		}
		else
		{
			DWORD dwError = GetLastError();
			printf("Failed to delete file. (error = %u)\n", dwError);
			Sleep(1000);
		}
	}

 

answered (572 point)
선택됨
+1 vote
파일 삭제 자체는 촘두 님 답변처럼 텀을 주서 일정 횟수로 재시도하는 게 해답인 것 같습니다(우수 답변으로 채택했습니다). 기술적인 궁금증 차원에서 덧붙이자면....

 

비회원 질문을 퍼온 것이라서 자세한 상황은 모르겠지만, OpenProcess를 호출하는 프로그램이 창을 생성하는 프로그램이라면(아마 업데이트나 패치 관련?) MSDN WaitForSingleObject 항목(https://msdn.microsoft.com/ko-kr/library/ms919205.aspx?f=255&MSPPError=-2147217396 )의 Remark 중 Use caution when calling the wait functions and code that directly or indirectly creates windows. ...  문단과 관련이 있을 지도 모르겠습니다. 남은 메시지들을 처리하는 과정에서 OS 차원에서 뭔가 미묘하게 타이밍이 어긋날 때가 있는게 아닌가 합니다. MSDN은 이런 경우  MsgWaitForMultipleObjects나 MsgWaitForMultipleObjectsEx를 사용하라고 하네요.
answered (72 point)
수정됨

MSDN 의 주의사항은

WaitForSingleObject 호출자측 스레드에 윈도우가 있을경우 WFMO, WFSO 류의 대기 함수를 쓰는동안 메시지 펌핑이 안되니 대신MsgWFMO 를 쓰라는 말 같습니다.

OpenProcess로 띄운 프로그램이 윈도우를 생성했는지 여부는 관계 없는 것 같습니다.

 

그렇네요. 고맙습니다!

일단 "OpenProcess로 띄운 프로그램이"  => "OpenProcess를 호출한 프로그램"로 수정했습니다...만 전체적으로 별 의미가 없는 답변인 것 같습니다;;;;

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

507 질문
654 answers
643 댓글
118,130 users