كيف يمكنني تلقائيا تدمر الطفل العمليات في ويندوز ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

في C++ ويندوز التطبيق ، وأنا إطلاق عدة طويلة تشغيل العمليات الطفل (حاليا أنا استخدم CreateProcess(...) للقيام بذلك.

أريد الطفل العمليات تلقائيا مغلقة إذا تعطل العمليات الرئيسية أو مغلقة.

لأن من شرط هذا يحتاج إلى عمل حادث من "الأصل", وأعتقد أن ذلك سوف تحتاج إلى القيام به باستخدام بعض API/سمة من سمات نظام التشغيل.حتى أن كل "الطفل" عمليات تنظيف.

كيف يمكنني فعل هذا ؟

هل كانت مفيدة؟

المحلول

API Windows يدعم كائنات تسمى "عمل الأشياء".التعليمة البرمجية التالية إنشاء "العمل" الذي تم تكوينه إلى إيقاف جميع العمليات عند التطبيق الرئيسية ينتهي (عندما مقابض تنظيف).هذا الرمز يجب أن يكون فقط تشغيل مرة واحدة.:

HANDLE ghJob = CreateJobObject( NULL, NULL); // GLOBAL
if( ghJob == NULL)
{
    ::MessageBox( 0, "Could not create job object", "TEST", MB_OK);
}
else
{
    JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };

    // Configure all child processes associated with the job to terminate when the
    jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
    if( 0 == SetInformationJobObject( ghJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)))
    {
        ::MessageBox( 0, "Could not SetInformationJobObject", "TEST", MB_OK);
    }
}

ثم عند كل عملية طفل يتم تنفيذ التعليمات البرمجية التالية إلى إطلاق كل طفل كل عملية إضافة إلى وظيفة وجوه:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;

// Launch child process - example is notepad.exe
if (::CreateProcess( NULL, "notepad.exe", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::MessageBox( 0, "CreateProcess succeeded.", "TEST", MB_OK);
    if(ghJob)
    {
        if(0 == AssignProcessToJobObject( ghJob, processInfo.hProcess))
        {
            ::MessageBox( 0, "Could not AssignProcessToObject", "TEST", MB_OK);
        }
    }

    // Can we free handles now? Not sure about this.
    //CloseHandle(processInfo.hProcess); 
    CloseHandle(processInfo.hThread);
}

VISTA ملاحظة:انظر AssignProcessToJobObject دائما العودة "تم رفض الوصول" على ويندوز فيستا إذا كنت تواجه رفض الوصول القضايا مع AssignProcessToObject() على ويندوز فيستا.

نصائح أخرى

واحد إلى حد ما hackish الحلول العملية الأصل أن نعلق على كل طفل كما مصحح (استخدام DebugActiveProcess).عندما المصحح إنهاء جميع debuggee عمليات إنهاء كذلك.

أفضل حل (على افتراض أنك كتبت الطفل العمليات وكذلك) أن يكون الطفل عمليات مراقبة الوالدين والخروج إذا كان يذهب بعيدا.

ويندوز وظيفة الأجسام يبدو وكأنه مكان جيد للبدء.اسم الوظيفة كائن يجب أن تكون معروفة ، أو تنتقل إلى الأطفال (أو وراثة مقبض).يحتاج الأطفال إلى إشعار عندما يموت والد إما من خلال فشل في التصنيف "ضربات القلب" أو مجرد WFMO/WFSO على الوالد عملية التعامل معها.في تلك المرحلة أي عملية طفل يمكن أن TermianteJobObject لاسقاط المجموعة بأكملها.

يمكنك أن تبقي منفصلة الوكالة الدولية للطاقة عملية قيد التشغيل.مهمتها الوحيدة هي مشاهدة العملية الحالية الفضاء لاكتشاف حالات مثل تصفون.حتى أنها يمكن أن إعادة إطلاق التطبيق الأصلي بعد حادث أو توفر مختلف خيارات المستخدم وجمع معلومات التصحيح ، إلخ.فقط حاول أن يبقيه بسيط بما فيه الكفاية بحيث لا تحتاج الثاني الوكالة الدولية للطاقة لمشاهدة أول واحد.

غالبا سيكون لديك للحفاظ على قائمة عمليات البدء ، وقتل منهم واحدا تلو الآخر عند الخروج من البرنامج.أنا لست متأكدا من تفاصيل تفعل هذا في C++ ولكن لا ينبغي أن يكون من الصعب.الجزء الصعب من المحتمل أن يكون ضمان أن الطفل عمليات إيقاف التشغيل في حالة تعطل التطبيق..صافي لديه القدرة على إضافة دالة على ما يسمى عند حدوث حدث استثناء غير معالج.أنا لست متأكدا مما إذا كان C++ يقدم نفس القدرات.

هل يمكن أن تغلف كل عملية في C++ موضوع الحفاظ على قائمة من لهم في النطاق العالمي.في المتلفات يمكن إيقاف كل عملية.من شأنها أن تعمل بشكل جيد إذا كان إنهاء البرنامج بشكل طبيعي لكن تعطل كل الرهانات.

هنا هو الخام على سبيل المثال:

class myprocess
{
public:
    myprocess(HANDLE hProcess)
        : _hProcess(hProcess)
    { }

    ~myprocess()
    {
        TerminateProcess(_hProcess, 0);
    }

private:
    HANDLE _hProcess;
};

std::list<myprocess> allprocesses;

ثم كلما إطلاق واحد اتصل allprocessess.push_back(hProcess);

قبالة الجزء العلوي من رأسي:

  • هل يعتبر استخدام المواضيع بدلا من العمليات ؟
  • محاولة تمرير مقبض الخيط الرئيسي/عملية للطفل العمليات والحصول عليها إلى الانتظار على أن التعامل معها.يعمل هذا على المواضيع ، في انتظار مؤشر ترابط ينتظر حتى أن الموضوع يكمل و المخارج.لست متأكدا إذا كان هذا سوف تعمل العمليات يجب أن تحقق MSDN للتحقق من ذلك.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top