سؤال

أخطط لاستخدام مواسير UNIX المسماة (MKFIFO) للحصول على مراسلة بسيطة متعددة العملية. ستكون الرسالة مجرد سطر واحد من النص.

هل تثبطني من ذلك؟ ما العقبات التي يجب أن أتوقعها؟

لقد لاحظت هذه القيود:

  1. لا يمكن أن يستمر المرسل حتى يتم استلام الرسالة.
  2. يتم حظر جهاز الاستقبال حتى هناك بعض البيانات. ستكون هناك حاجة إلى عدم حاجة IO عندما نحتاج إلى إيقاف القراءة. على سبيل المثال، قد يسأل مؤشر ترابط آخر.
  3. يمكن للمستقبل الحصول على العديد من الرسائل في قراءة واحدة. هذه يجب معالجتها قبل الاستقالة.
  4. الحد الأقصى لطول الرسالة الذرية محدود بمقدار 4096 بايت. هذا هو الحد من PIBIN_BUF على Linux (انظر أنابيب الرجل 7).

سأقوم بتنفيذ المراسلة في بيثون. لكن العقبات تعقد بشكل عام.

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

المحلول

  1. عدم قابلية قابلية - هم أساسا شيء UNIX. مآخذ أكثر محمولة.
  2. من الصعب التوسع إلى أنظمة متعددة (مآخذ أخرى +)
  3. من ناحية أخرى، أعتقد أن الأنابيب أسرع من المقابس للعمليات على نفس الجهاز (أقل اتصالات التواصل).

بالنسبة للقيود الخاصة بك،

  1. يمكنك "تحديد"على الأنابيب، للقيام بقراءة غير حظر.
  2. أنا عادة (في بيرل) طباعة رسائلي على الأنابيب منفصلة عن طريق " n"، وقراءة خط منها للحصول على رسالة واحدة في وقت واحد.
  3. هل توخي الحذر مع الطول الذري.

وجدت perlipc. أن تكون مناقشة جيدة بين الخيارات المختلفة، على الرغم من أنه يحتوي على رمز محدد.

نصائح أخرى

يمكن عمل الحظر، سواء على جانب المرسل وجانب المتلقي، في جميع أنحاء عن طريق عدم الحجب I / O.

مزيد من القيود على خمسة

  • عميل واحد فقط في وقت واحد.
  • بعد إغلاق العميل FIFO، يحتاج الخادم إلى إعادة فتح نقطة النهاية.
  • أحادي الاتجاه.

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

كمنفعة إضافية، إذا كنت ترغب في توسيع نطاقها للتواصل بين الأجهزة المتعددة، فإنه بالكاد أي تغيير على الإطلاق. على سبيل المثال، فقط تأخذ صفحة وثائق بيثون على قابس كهرباء واستبدال socket.AF_INET مع socket.AF_UNIX, (HOST, PORT) مع filename, وهما فقط يعمل.

SOCK_STREAM سوف تعطيك سلوك تشبه البث. وهذا هو، قد يتم دمج اثنين من الرسل في تلقي واحد أو العكس. AF_UNIX يدعم أيضا SOCK_DGRAM: مضمونة مخططات البيانات ليتم إرسالها وقراءة كل وحدة واحدة أم لا على الإطلاق. (مماثل، AF_INET+SOCK_STREAM= TCP، AF_INET+SOCK_DGRAM= UDP.)

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