سؤال

أنا أعمل مع برنامج متعدد الخيوط (باستخدام pthreads) يقوم حاليًا بإنشاء مؤشر ترابط في الخلفية (PTHREAD_DETACHED) ثم يستدعي pthread_exit(0).مشكلتي هي أن العملية يتم إدراجها بعد ذلك على أنها "معطلة" ومن الغريب أنها لا تبدو "موجودة بالفعل" في/proc (مما يهزم إستراتيجيات تصحيح الأخطاء الخاصة بي)

أرغب في تلبية المتطلبات التالية:

  • يجب أن يقوم البرنامج بتشغيل الدالة A في حلقة والوظيفة B مرة واحدة
  • نظرًا لمعرف PID الخاص بالبرنامج، يجب أن يكون /proc/$pid/exe و/proc/$pid/maps و/proc/$pid/fd متاحين للوصول (عندما تكون العملية معطلة، تكون جميعها روابط فارغة أو غير صالحة)
  • يجب أن يكون من الممكن تعليق/مقاطعة البرنامج باستخدام CTRL+C وCTRL+Z كالمعتاد

يحرر: أتردد في تغيير واجهة البرنامج لوجود A في سلسلة الرسائل "الرئيسية" و B في سلسلة رسائل منبثقة (وهم حاليًا في الاتجاه الآخر).هل سيحل المشكلة؟

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

المحلول

يمكنك إما تعليق تنفيذ العملية الرئيسية في انتظار الإشارة، أو عدم فصل الخيط (باستخدام الإعداد الافتراضي PHTRAD_CRATE_JOINABLE) في انتظار إنهائه مع أ pthread_join().

نصائح أخرى

هل هناك سبب يمنعك من فعل الأشياء بالعكس:هل يقوم الخيط الرئيسي بتشغيل الحلقة والقيام بالمهمة لمرة واحدة في خيط الخلفية؟

ليس التصميم الأكثر أناقة ولكن ربما يمكنك حظر الخيط الرئيسي قبل الخروج باستخدام:

 while(1) {
       pause();
 }

ثم يمكنك تثبيت معالج الإشارة لـ SIGINT وSIGTERM الذي يكسر الحلقة.أسهل طريقة لذلك هي:خروج (0) :-).

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