TerminateProcess nicht Thread-/Prozesssicher?



  • Hi.
    Ich habe etwas mit meiner Klassenlibrary rumgespielt, ich poste mal den Code, was ich mache sollte aus dem Kontext verständlich sein 😉

    #include <string>
    #include <iostream>
    
    #include <Navigator/Process.hpp>
    
    int main()
    {
    	try
    	{
    		while(true)
    		{
    			std::vector<DWORD> pidList = Navigator::Process::getProcessListByName(L"calc.exe");
    			if(pidList.size() != 0)
    			{
    				std::wcout << L"New process detected !" << std::endl;
    
    				for(unsigned int i = 0; i < pidList.size(); i++)
    				{
    					std::wcout << pidList[i] << std:: endl;
    
    					Navigator::Process proc;
    					proc.setManually(pidList[i]);
    					proc.open();
    					proc.terminate();
    					Sleep(5);
    				}
    			}
    
    			Sleep(10);
    		}
    	}
    	catch(const std::exception& e)
    	{
    		std::cout << e.what() << std::endl;
    	}
    }
    

    Ich wollte einfach mal nen kleinen Killer basteln der den Missbrauch des Taschenrechners stoppt 😉

    Aber...jetzt kommt mein Problem:
    Wenn ich den Sleep nach terminate entferne, ist der Prozess meist im nächsten Durchlauf noch da!
    Ist es nicht garantiert, dass alle WinAPI-Funktionen "sicher" sind? Wie kann es dann sein, dass TerminateProcess() einen Wert zurückgibt obwohl der Prozess noch am Leben ist, man das Handle sogar noch nutzen könnte?

    Ausgabe OHNE den Sleep (Ja, es wird eine Exception geworfen da das Handle während dem Durchlauf erst ungültig geworden ist, das mag TerminateProcess() nicht gern...) bei 6 gestarteten Taschenrechnern:

    New process detected !
    3124
    2456
    2644
    3416
    3360
    1352
    New process detected !
    3124
    2456
    2644
    3416
    3360
    1352
    New process detected !
    3124
    2456
    2644
    3416
    3360
    1352
    New process detected !
    2644
    3416
    3360
    Process::terminate() Error : TerminateProcess() failed

    Mit dem Sleep nach terminate funktioniert alles top.

    Ich weiß dass die Sache etwas weltfremd ist 😉 aber...es verstört mich etwas.
    Ich war mir immer sicher dass soetwas nicht passieren kann (garantiert).



  • Hallo,

    wenn man es genau nimmt, steht nur geschrieben:

    initiates termination and returns immediately 😉

    Und dass es Gründe gibt, dass ein Prozess länger braucht, bis er wirklich "tot" ist, kann man hier:

    http://blogs.msdn.com/oldnewthing/archive/2004/07/23/192531.aspx

    nachlesen. Mag zwar nicht auf alle Prozesse zutreffen, dennoch, ein wenig Zeit wird doch immer benötigt.

    MfG,

    Probe-Nutzer


Log in to reply