मैं इन सबसे छुटकारा इस तरह एक Windows सी प्रोग्राम है जो एक पुनः निर्देशित stdin
पाइप के माध्यम से अपने डेटा हो जाता है,:, रीडायरेक्ट किए गए पाइप को नॉन-अवरुद्ध करने वाला स्टडीन कैसे है?
./some-data-generator | ./myprogram
समस्या यह है कि मैं एक गैर अवरुद्ध ढंग से stdin
से पढ़ने में सक्षम हो की जरूरत है। इसका कारण यह है कि (1) इनपुट एक डेटा स्ट्रीम है और EOF
नहीं है और (2) कार्यक्रम को किसी भी समय अपने stdin
-reading थ्रेड को निरस्त करने में सक्षम होना चाहिए। fread
ब्लॉक जब कोई डेटा नहीं है, तो यह बहुत मुश्किल बनाता है।
यूनिक्स में यह कोई समस्या नहीं है, क्योंकि आप 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
) के साथ विफल रहता है।
मुझे यकीन नहीं है कि और क्या करना है। क्या यह वास्तव में असंभव है (!) या यह सिर्फ अत्यधिक अपमानित है? इस विशेष मुद्दे के लिए नेट पर संसाधन बल्कि दुर्लभ हैं।
PeekNamedPipe वह था जो मैं ढूंढ रहा था ... यह आपको रीडफाइल को कॉल करने की अनुमति देता है ताकि यह अवरुद्ध न हो। – paleozogt