أداء مكافئ لـ "Kill Process Tree" في لغة C++ على نظام التشغيل Windows
سؤال
لدينا مهمة C++ من شأنها أن تؤدي إلى عملية جديدة.قد تحتوي هذه العملية بدورها على عدة عمليات فرعية.إذا تجاوزت المهمة الوقت المخصص لها، فسنرغب في إنهاء تلك العملية المتشعبة.
ومع ذلك، فإننا لا نريد عزل العمليات التي نتجت عنها.نريدهم جميعا أن يموتوا.لقد استخدمت Process Explorer ولديه خيار "Kill Process Tree"، على غرار "End Process Tree" في Windows Task Manager، لذلك أعتقد/أفترض أن هناك واجهة برمجة تطبيقات عامة للقيام بذلك.هل قام أي شخص بذلك، أو يعرف إشارة إلى واجهة برمجة التطبيقات العامة التي تفعل ذلك؟
المحلول
وقد ترغب في النظر في "وظائف API". CreateJobObject
والأصدقاء. يمكنك فرض عمليات الأطفال على البقاء داخل العمل، من خلال تحديد السمة المناسبة. ثم يمكنك الاتصال TerminateJobObject
قتما تشاء.
وتوضيح: ليس هذا ما يفعل إدارة المهام
نصائح أخرى
وأقترح تسير في الطريق كائن الوظيفة، كما هو مبين أعلاه، سيكون الأكثر موثوقية.
إذا كنت لا يمكن ان يستمر الطريق كائن الوظيفة، يمكنك استخدام API toolhelp للحصول على عملية الأصل ID وبناء الشجرة بهذه الطريقة. كن حذرا مع ذلك، منذ لم يكن لديك ويندوز أحد الوالدين علاقة قوية / الطفل وأنه من الممكن لفي PID للحصول على إعادة تدويرها. يمكنك استخدام GetProcessTimes
للاستعلام عن وقت إنشاء هذه العملية، وتحقق من أنه أكبر سنا من الطفل. إذا تم إنهاء عملية وسيطة في شجرة، فلن تكون قادرة على السير على شجرة أخرى.
// Error handling removed for brevity
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
Process32First(snapshot, &process);
do
{
// process.th32ProcessId is the PID.
// process.th32ParentProcessID is the parent PID.
} while (Process32Next(snapshot, &process));
هناك وظيفة Win32 تسمى إنهاء العملية ().يجب أن تقوم بهذه المهمة نيابة عنك.
وبدلاً من ذلك، وجدت أن أمر Taskkill مفيدًا لأشياء مثل هذه.
من سطر الأوامر:
taskkill /F /T /IM program.exe
من الكود:
system("taskkill /F /T /IM program.exe");
مفاتيح أخرى (مباشرة من Taskkill /؟):
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T] Description: This command line tool can be used to end one or more processes. Processes can be killed by the process id or image name. Parameter List: /S system Specifies the remote system to connect to. /U [domain\]user Specifies the user context under which the command should execute. /P [password] Specifies the password for the given user context. Prompts for input if omitted. /F Specifies to forcefully terminate process(es). /FI filter Displays a set of tasks that match a given criteria specified by the filter. /PID process id Specifies the PID of the process that has to be terminated. /IM image name Specifies the image name of the process that has to be terminated. Wildcard '*' can be used to specify all image names. /T Tree kill: terminates the specified process and any child processes which were started by it. /? Displays this help/usage.
-جون
وترغب في العثور على معرف العملية للعملية التي تريد قتل، ثم "السير على شجرة" من أبنائها (وأطفالهم، وهلم جرا ...)، لاحظ PIDS بهم، ومن ثم إنهاء كافة العمليات لطيفة وبسرعة.
ويمكنك أيضا استخدام WMI، تخطيط الطريق يمكنك إنشاء فئة لأداء المهام.
سي هذا "أين يمكنني العثور على وثائق WMI؟" <ر >
و المكتبة WMI COM
وأمثلة WMI C ++ تطبيق