أداء مكافئ لـ "Kill Process Tree" في لغة C++ على نظام التشغيل Windows

StackOverflow https://stackoverflow.com/questions/604522

  •  03-07-2019
  •  | 
  •  

سؤال

لدينا مهمة 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 ++ تطبيق

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top