2017-12-11 9 views
-3

실수로 CreateProcess를 계속 호출하는 프로그램을 작성하여 무한 루프가 발생했습니다.Windows : 스스로 생성하는 프로그램을 종료하십시오.

이 프로그램을 실행하기 시작하면 어떻게해야합니까? 필자는 작업 관리자를 통해이 작업을 중단하려고 시도했지만 프로그램이 시작되어 즉시 죽기 때문에 작업 관리자에서 사라지고 다시 나타나서 멈추지 않습니다.

이 문제를 막을 수있는 유일한 방법은 매우 불편할 수있는 PC를 재부팅하는 것입니다. 보기의 최종 사용자 관점에서

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) 
{  
    using namespace std;  
    CreateProcess(L"self.exe", 
        NULL,   // No command line arguments 
        NULL,   // Process handle not inheritable 
        NULL,   // Thread handle not inheritable 
        NULL,   // Set handle inheritance to NULL 
        NULL,   // No creation flags 
        NULL,   // Use parent's environment block 
        NULL,   // Use parent's starting directory 
        &lpStartupInfo, // Pointer to STARTUPINFO structure 
        &lpProcessInfo // Pointer to PROCESS_INFORMATION structure 
        ); 

    return 0; 
    //return (int)msg.wParam; 
} 
+4

PC를 재부팅하고 실행 파일을 다시 실행하지 마십시오 ...? – user463035818

+0

앱의 다른 인스턴스가 이미 실행 중인지 확인하기 위해 뮤텍스를 만듭니다. 실행중인 경우 다른 프로세스를 만들기 전에 종료하십시오. 힌트 :'CreateMutex'와'GetLastError'를 사용하십시오. – Asesh

+0

@ tobi303 다른 방법이 있는지 묻고 싶습니다. 나는 내 질문을 명확하게 정리했다고 믿을 때 downvotes를 이해하지 못한다. – dk123

답변

1

는 쉬운 솔루션은 델Ctrl 키 + Alt 키를 + 를 눌러 로그 오프하는 것입니다. 세션을 유지하려면 포크 - 폭탄에 대한 유일한 해결책은 프로세스 트리를 이해하는 도구를 사용하는 것입니다. taskkill /T /IM self.exe 또는 프로세스 탐색기의 "프로세스 트리 죽이기"기능을 참조하십시오. 자식 프로세스는 계속 지나쳐 숨을 수 있으므로 kill 명령을 여러 번 실행해야 할 수도 있습니다. 나는이에 대한 킬 (kill) 도구를 프로그래밍 한 경우


나는 프로세스를 열거 할 것이며, 대상 프로세스가 발견되면 당신은 핸들을 열고 job object와 연결하려고합니다. 작업 개체를 사용하면 하위 프로세스 생성을 거부하고 작업의 모든 프로세스를 쉽게 종료 할 수 있습니다. 프로세스를 작업에 추가 할 수없는 경우 TerminateProcess으로 문의하십시오.

원하는 프로세스를 모두 종료 할 때까지 루프에서이 열거 형 코드를 실행해야합니다.