سؤال

يدعم Linux إرسال إشارة Posix-Signal التعسفية مثل SIGINT أو SIGTERM إلى عملية باستخدام kill-يأمر.بينما SIGINT و SIGTERM هي مجرد طرق قديمة مملة لإنهاء العملية بطريقة ودية أو غير ودية، SIGQUIT والمقصود أن يؤدي إلى تفريغ الأساسية.يمكن استخدام هذا لتشغيل Java VM قيد التشغيل لطباعة ملف تفريغ لسلسلة الرسائل، بما في ذلك التتبعات المكدسة لجميع سلاسل الرسائل قيد التشغيل - أنيق!بعد طباعة معلومات التصحيح، سيستمر Java VM في القيام بكل ما كان يفعله من قبل؛في الواقع، يحدث تفريغ مؤشر الترابط في مؤشر ترابط آخر ذو أولوية قصوى.(يمكنك تجربة ذلك بنفسك باستخدام kill -3 <VM-PID>.)

لاحظ أنه يمكنك أيضًا تسجيل معالجات الإشارة الخاصة بك باستخدام الملف (غير مدعوم!) Signal و SignalHandler الطبقات في sun.misc- العبوة، حتى تتمكن من الاستمتاع بجميع أنواع المرح معها.

ومع ذلك، لم أجد بعد طريقة لإرسال إشارة إلى عملية Windows. يتم إنشاء الإشارات بواسطة مدخلات مستخدم معينة: Ctrl-C يثير أ SIGINT على كلا المنصتين، على سبيل المثال.ولكن لا يبدو أن هناك أي فائدة لإرسال إشارة يدويًا إلى عملية قيد التشغيل، ولكنها غير تفاعلية على Windows.الحل الواضح هو استخدام Cygwin kill قابل للتنفيذ، ولكن على الرغم من أنه يمكنه إنهاء عمليات Windows باستخدام واجهة برمجة تطبيقات Windows المناسبة، إلا أنني لم أتمكن من إرسال ملف SIGBREAK (ما يعادل ويندوز SIGQUIT) معها؛في الحقيقة أعتقد أن الإشارة الوحيدة التي يمكنه إرسالها إلى عمليات Windows هي SIGTERM.

لذا، لكي أختصر القصة الطويلة وأكرر العنوان:كيف أرسل إشارة عشوائية إلى عملية في نظام التشغيل Windows؟

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

المحلول

إذا كان ما تريده هو قتل برنامج/عملية أخرى من أي نوع بشكل صريح/برمجي، فداخل أدوات SysInternals توجد أداة صغيرة تسمى "pskill" تتصرف تمامًا مثل "kill" Unixen.

إذا كنت تريد شيئًا آخر، فاستمر في القراءة (على الرغم من أنني قد أكون مخطئًا في بعض التفاصيل أدناه - لقد مرت دهور منذ آخر مرة قمت فيها بتطوير برنامج Windows في لغة C باستخدام WinAPI فقط وكتب Charles Petzold الممتازة "البرمجة لنظام التشغيل Windows" كدليل ).

في نظام التشغيل Windows، ليس لديك "إشارات" بشكل صحيح، والوظائف التي يتلقاها WinMain وWinProc من نظام التشغيل بسيطة رسائل.على سبيل المثال، عند النقر فوق الزر "X" في النافذة، يرسل Windows لمعالج النوافذ الرسالة WM_CLOSE.عندما يتم حذف النافذة ولكن البرنامج لا يزال قيد التشغيل، فإنه يرسل WM_DESTROY.عندما يكون على وشك الخروج من حلقة معالجة الرسائل الرئيسية، يتلقى WinMain (وليس WinProc) WM_QUIT.يجب أن يستجيب برنامجك لكل هذه الأمور كما هو متوقع - يمكنك بالفعل تطوير تطبيق "غير قابل للإغلاق" من خلال عدم القيام بما يجب عليه فعله عند تلقي WM_CLOSE.

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

أتذكر أنه كانت هناك طريقة للحصول على HWND لنافذة عملية أخرى، بمجرد حصولك على تلك العملية الأخرى، يمكنها إرسال رسالة إلى تلك النافذة من خلال وظائف PostMessage وDispatchMessage.

نصائح أخرى

ويندوز ليس POSIX.ليس لديها إشارات."الإشارات" الوحيدة التي تتلقاها برامج وحدة التحكم هي إذا اتصلت بها SetConsoleCtrlHandler, ، وفي هذه الحالة يمكن إعلامك بأن المستخدم قد ضغط على Ctrl+C، أو Ctrl+Break، أو أغلق نافذة وحدة التحكم، أو قام بتسجيل الخروج، أو أغلق النظام.

يتم تنفيذ كل شيء آخر باستخدام IPC، عادةً باستخدام رسائل النافذة أو RPC.تحقق من وثائق Sun لمعرفة ما إذا كانت هناك طريقة للقيام بما تطلبه على Windows JRE.

في Windows، كل شيء يدور حول رسائل Win32.لا أعتقد أن هناك أداة سطر أوامر للقيام بذلك، ولكن في C++ يمكنك استخدامها FindWindow لإرسال رسالة عشوائية إلى برنامج Windows آخر.على سبيل المثال:

#define WM_MYMSG  ( WM_USER+0x100 )
HWND h = ::FindWindow(NULL,_T("Win32App"));
if (h) {
    ::PostMessage(h, WM_MYMSG, 0, 0);
}

يمكن القيام بذلك أيضًا في C# باستخدام com interop.

يمكنك أيضًا استخدام jconsole لعرض تتبع المكدس لجميع سلاسل الرسائل قيد التشغيل.سيعمل هذا على نظام التشغيل Windows وأي نظام تشغيل آخر يدعم Java.يحتوي jconsole أيضًا على العديد من الميزات الرائعة الأخرى، ورسوم بيانية للذاكرة، ورسوم بيانية لوحدة المعالجة المركزية، وما إلى ذلك.

إنه لا يجيب على سؤالك الأصلي، ولكن نأمل أن يسمح لك بالحصول على نفس النتائج.

إذا لم تكن على دراية بـ jconsole، فاطلع على باستخدام جي كونسول توثيق.

أنا فقط أتساءل عما إذا كان أدوات بس من، الآن مملوكة لشركة مايكروسوفت، سيس إنترنالز سوف تساعدك.

روبي قادر بطريقة ما على (على الأقل محاكاة) SIGINT SIGKILL وما إلى ذلك.على النوافذ، واحتجاز تلك الرسائل.قد ترغب في التحقق من ذلك.

كيف تقوم روبي "بإرسال إشارة SIGINT إلى تلك العملية" الموجودة أسفلها، في نظام التشغيل Windows، هي في الواقع عملية اتصال TerminateProcess أو ما يعادله على ذلك PID.

هناك أيضًا طريقة مكافئة لنظام التشغيل Windows لـ "التقاط ctrl+c" وأتخيل أنها ما يطلق عليه هناك.

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