كيف يمكنني إجراء FOPEN غير حظر على أنبوب مسمى (MKFIFO)؟

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

سؤال

إذا كان لدي برنامج يخلق ويحاول فتح أنبوب مسمى باستخدام Mkfifo، كيف يمكنني فتح أنبوب للقراءة أو الكتابة دون حظر؟

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

في البرنامج C، قمت بإنشاء الأنابيب المسماة بنجاح باستخدام Mkfifo، ولكن عندما أفعل

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/

FOPEN لا يعود حتى يفتح واجهة المستخدم الرسومية أن الأنابيب للكتابة. ما أود فعله هو أن يكون هذا الأنبوب جاهزا للقراءة مرة واحدة (إذا) يقرر GUI الكتابة إليها - سأضع واصف الملف في استدعاء محدد (). من المعقول أن نتوقع أن يبدأ فعلي جافا واجهة المستخدم الرسومية، لذلك لا يمكنني الاعتماد عليها لفتح الطرف الآخر من الأنبوب في أي نقطة محددة أو حتى على الإطلاق.

سيكون لدي أيضا أنابيب ثانية مفتوحة للكتابة، وأنا أفترض أنني سأحصل على نفس المشكلة. علاوة على ذلك، لا يمكنني تعيين O_NONBLOCK على أنبوب الإخراج الذي ليس لديه قارئ.

أي اقتراحات؟

(يعمل هذا على نظام Linux)

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

المحلول

يمكنك open() أنابيك O_RDONLY | O_NONBLOCK, ، وإذا كنت تريد دفق C، يمكنك الحصول عليه fdopen(). وبعد ومع ذلك، قد يكون هناك مشكلة مع select() - AFAIK، أنابيب FD مفتوحة للقراءة التي ليس لها كاتب مستعد دائما للقراءة، و read() إرجاع 0، لذلك select() سوف النار إلى أجل غير مسمى.

وسيلة كليغجي للتغلب على هذا هو فتح الأنبوب O_RDWR; ؛ هذا هو، لديك كاتب واحد على الأقل (برنامج C ++ الخاص بك). والتي من شأنها أن تحل مشكلتك على أي حال.

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