في نظام التشغيل windows، كيف يكون لديك stdin غير محظور وهو عبارة عن أنبوب مُعاد توجيهه؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

لدي برنامج Windows C يحصل على بياناته من خلال ملف مُعاد توجيهه stdin الأنابيب، مثل هذا:

./some-data-generator | ./myprogram

المشكلة هي أنني بحاجة إلى أن أكون قادرًا على القراءة منها stdin بطريقة غير مانعة.والسبب في ذلك هو أن (1) الإدخال عبارة عن دفق بيانات ولا يوجد EOF و (2) يجب أن يكون البرنامج قادراً على إيقاف تشغيله stdin-قراءة الموضوع في أي وقت. fread يتم الحظر في حالة عدم وجود بيانات، مما يجعل الأمر صعبًا للغاية.

في Unix، لا توجد مشكلة، حيث يمكنك ضبط وضع الحظر لواصف الملف باستخدام fcntl و O_NONBLOCK.لكن، fcntl غير موجود على النوافذ.

حاولت استخدام SetNamedPipeHandleState:

    DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
    BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
    DWORD err= GetLastError();

ولكن هذا فشل مع ERROR_ACCESS_DENIED (0x5).

لست متأكدا ماذا أفعل.هل هذا مستحيل بالفعل (!) أم أنه غامض للغاية؟الموارد الموجودة على الشبكة قليلة إلى حد ما بالنسبة لهذه المشكلة بالذات.

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

المحلول

نهج الطلب، والتحقق من وجود مدخلات جاهزة للقراءة:

  • بالنسبة لوضع وحدة التحكم، يمكنك استخدام GetNumberOfConsoleInputEvents().
  • لإعادة توجيه توجيه الإخراج، يمكنك استخدام PeekNamedPipe()

نصائح أخرى

هل يمكن استخدام المتزامن I / O لقراءة من التعامل معها، مثل الدعوة WIN32 ReadFileEx (). استخدام CancelIo () لإنهاء القراءة في غياب المدخلات.

وانظر MSDN على http://msdn.microsoft كوم / EN-US / مكتبة / aa365468 (VS.85) .aspx اتصال

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