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() failedMit 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