ما هي طريقة محمولة جيدة لتنفيذ حدث عالمي قابل للإشارة في بيئة POSIX

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

  •  29-09-2019
  •  | 
  •  

سؤال

حالة الاستخدام هي أن تطبيقًا واحدًا ينشئ حدثًا ويرسل إشارة إلى أن أي تطبيق يهتم بالاستماع إليه سيحصل عليه. على سبيل المثال ، يقوم التطبيق بتحديث محتويات ملف وإشارات هذا. على Linux يمكن القيام بذلك من قبل النوادل الذين يدعون Inotify على الملف. ستكون إحدى الطرق المحمولة للمستمعين التسجيل في خادم معروف ، لكنني أفضل شيء أبسط إن أمكن. إن المحمولة المحمولة قدر الإمكان يعني استخدام ميزات POSIX فقط والتي تتوفر أيضًا على نطاق واسع.

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

المحلول

الخيار باستخدام ملفات القفل

يمكنك القيام بذلك عن طريق قفل ملف.

الإعداد الأولي للإشارة:

  • قم بإنشاء ملف يحمل اسمًا معروفًا وقفله للكتابة (fcntl(F_SETLK) مع F_WRLCK أو قطيع (lock_ex) `).

إجراءات استقبال الإشارة:

  • افتح الملف باستخدام اسم الملف المعروف وحاول الحصول على قفل قراءة عليه (fcntl(F_SETLK) مع F_RDLCK أو flock(LOCK_SH)).
  • كتل المتلقي لأن باعث يحمل قفل كتابة متضارب.

انبعاث الإشارة:

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

في باعث الإشارة ، أصبح ملف القفل المؤقت الذي تمت إعادة تسميته فوق ملف القفل الأصلي الآن هو ملف القفل الحالي الجديد.

الخيار باستخدام شبكة البث المتعدد

اطلب من أجهزة الاستقبال الانضمام إلى مجموعة البث المتعدد وانتظر الحزم. اطلب من باعث الإشارة إرسال حزم UDP إلى مجموعة البث المتعدد هذه.

يمكنك ربط كلاً من مآخذ UDP المرسلة واستلامها لواجهة الاسترجاع إذا كنت تريد استخدام الاتصال المحلي المضيف فقط.

نصائح أخرى

في النهاية ، استخدمت مقبس مجال UNIX مقيد. يحتفظ المالك بمجموعة من FDS Client ويرسل كل رسالة عندما يكون هناك حدث.

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