هل من الممكن قتل تطبيق C ++ على نظام التشغيل Windows XP دون إفتراض مكدس المكالمات؟

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

سؤال

فهمي هو أنه عندما تقتل تطبيق C ++ من خلال إدارة المهام في نظام التشغيل Windows XP، لا يزال التطبيق "نظيف" مدمرا - أي مكدس المكالمات سوف يسترخي وسيحذر جميع مدمرات الكائنات ذات الصلة. لست متأكدا مما إذا كان فهمي خطأ هنا.

هل من الممكن قتل مثل هذا الطلب على الفور، دون أن تفقد المكدس؟

على سبيل المثال، قد يوظف التطبيق أنماط Raii التي ستدمر أو تحرير الموارد عند تدمير كائن. إذا كانت "عملية القتل التقليدية" من خلال مدير المهام رشيقة، مما يوفر وسيلة لقتل التطبيق فورا سوف تسمح لي اختبار الاغلاق غير الجريمة (مثل انقطاع التيار الكهربائي).

تعديل:

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

تعديل:

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

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

المحلول

أعتقد أن مدير المهام يحاول إيقاف تشغيل "لطيف" عن طريق إرسال رسالة WM_CLOSE، ثم إذا لم يستجب التطبيق قد قتل.

يجب أن تقتل هذه المكالمة العملية على الفور دون تحذير:

termateProcess.

على سبيل المثال:

TerminateProcess(GetCurrentProcess(), 1);

تحديث:

قد تجد هذه المقالة مثيرة للاهتمام:

وقت الإقلاع عن التدخين: الخروج من برنامج C ++

تحديث 2:

يجب أن أكون قادرا على استخدام الحل على البرامج التي ليس لدي شفرة المصدر

حسنا، هذا هو السلوك غير المرغوب فيه 99.9٪ من الوقت.

sysinternals لديها فائدة تسمى pskill:

http://technet.microsoft.com/en-us/sysinternals/bb896683.aspx.

لكنني لست متأكدا كيف "لطيفة" هو.

قد تحتاج إلى لفة خاصة بك، ولكن يجب أن تكون سهلة للغاية:

DWORD pid = <get pid from command line>;

TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, pid));

نصائح أخرى

طريقة Windows القياسية للقيام بذلك، دون الاعتماد على أدوات الحزب الثالث، هي استخدام taskkill /f:

taskkill /f <process-id>
taskkill /f /im <process-executable-name> 

/f يعني "القوة" هنا، وتضمن أنه تم إنهاء هذه العملية دون قيد أو شرط وعلى الفور، مع عدم وجود استعلام أو تحذير.

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

أولا، إذا كنت لا تستخدم عملية النهاية في علامة التبويب العمليات، فجرب ذلك.

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

أعتقد أن طريقة المكتبة القياسية C الخروج (0)؛ ستفعل ذلك بالضبط، إحباط البرنامج دون استدعاء أي ديميلات، موزعون، إلخ.

جرب ذلك، واسمحوا لي أن أعرف ما إذا كان يلبي احتياجاتك؟

يبدو أن إحباط () سوف يمنحك خروج غير طبيعي.

ANSI 4.10.4.1 سلوك وظيفة الإجهاض فيما يتعلق بالملفات المفتوحة والمؤقتة وظيفة إحباطها لا تغلق الملفات المفتوحة أو مؤقتة. انها لا تدفق المخازن المؤقتة مصدر

و

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

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

اسمه aptly. Kill Tool, ، متاح من تنزيل Microsoft. هو جزء من جناح Windbg أيضا.

أداة Kill، Kill.exe، تنهي عملية واحدة أو أكثر وجميع مؤشرات الترابط الخاصة بهم. تعمل هذه الأداة فقط على العمليات التي تعمل على الكمبيوتر المحلي.

kill /f <process>

علي سبيل المثال، kill /f lsass (مجرد مزاح، تفعل ليس قتل LSA!). إذا كنت ترغب في لفة خاصة بك، فإنه ينتهي هو الطريق للذهاب.

سيقتل الإحباط من وظيفة C () في المكتبة القياسية على الفور تطبيقك بدون تنظيف.

يحدد C ++ وظيفة عالمية قياسية (). دعوة سيكون أيضا الخروج على الفور من طلبك.

إنهاء سلوك إنهاء () قد يتم تجاوزه بواسطة وظيفة Set_terminate. يستدعي إحباط افتراضيا.

هناك مرافق حولها التي يمكن أن تمنع إعادة التشغيل.

hidetoolz. هل هذا على سبيل المثال - هناك مربع اختيار مدفون في مكان ما سيجعله يسألك عندما يبدأ شيء في إعادة التشغيل. يتم اكتشافه من قبل العديد من مكافحة الفيروسات ك rootkit (الذي هو عليه، ولكن هذا واحد يفترض أن يرم)، لذلك قد يكون من التحقيق في أن تعمل على الأنظمة التي لا تملكها تحكم كامل (عند تكليف مكافحة الفيروسات عن طريق سياسة المجال، إلخ)

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