في نظام التشغيل windows، كيف يكون لديك stdin غير محظور وهو عبارة عن أنبوب مُعاد توجيهه؟
سؤال
لدي برنامج 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 اتصال