هل هناك تداعيات لكتابة العديد من العمليات إلى قارئ واحد على أنبوب مسمى في posix؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

أنا أكتب برنامجًا لـ POSIX (OSX) حيث سيكون لدي العديد من العمليات لإرسال الرسائل إلى مستمع واحد، وهو في الأساس سلسلة تسجيل.يتم تشغيل جميع العمليات في برامج منفصلة، ​​واستخدام أنبوب مسمى واحد (FIFO) تكتب إليه العديد من العمليات، ولكن عملية واحدة فقط للقراءة منها أمر مغرٍ للغاية.

أسئلة:

1) هل سينجح هذا؟- يمكنني تنفيذ هذا العمل باستخدام bash لإعداد ملف fifo مع عمليات الكتابة المتعددة إليه، لذلك أعرف نظريًا أن هذا يعمل.لكن من الناحية العملية، هل هناك قضايا أتجاهلها؟

قذيفة رقم 1

$ mkfifo /tmp/fifo
$ cat /tmp/fifo

القذائف رقم 2 و رقم 3

$ cat > /tmp/fifo
"Type stuff here, after hitting enter, it is read by shell #1"

2) إذا كان كل كاتب يكتب فقط رسائل قصيرة نسبيًا (<100 بايت؟) فهل يمكنني افتراض أن كل استدعاء للكتابة () سيتم إرساله إلى القارئ بالكامل؟أم أن نصف رسالة ما ستكون معرضة لخطر التشويه بنصف رسالة أخرى من كاتب مختلف؟

شكرا على أي نصيحة.

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

المحلول

يجب أن تكون كتابة FIFO ذرية، طالما أنها أقل من حجم الصفحة.لذلك لا ينبغي أن تكون هناك مشكلة في الرسائل التي يبلغ حجمها 100 بايت.في نظام التشغيل Linux، كان الحد الأقصى للحجم هو 4K، وأعتقد أنه أكبر الآن.لقد استخدمت هذه التقنية على عدد قليل من الأنظمة لتمرير الرسائل، حيث أن عمليات الكتابة تنتهي بشكل ذري.

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

s="This is a message"
echo $s

لا

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