2009-05-15 10 views
6

मैं इन सबसे छुटकारा इस तरह एक 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) के साथ विफल रहता है।

मुझे यकीन नहीं है कि और क्या करना है। क्या यह वास्तव में असंभव है (!) या यह सिर्फ अत्यधिक अपमानित है? इस विशेष मुद्दे के लिए नेट पर संसाधन बल्कि दुर्लभ हैं।

उत्तर

3

आदेश apprach पर

देखें MSDN, जाँच पढ़ने के लिए तैयार इनपुट है:

  • कंसोल मोड के लिए आपके GetNumberOfConsoleInputEvents उपयोग कर सकते हैं()।
  • पाइप पुनर्निर्देशन के लिए, आप PeekNamedPipe उपयोग कर सकते हैं()
+0

PeekNamedPipe वह था जो मैं ढूंढ रहा था ... यह आपको रीडफाइल को कॉल करने की अनुमति देता है ताकि यह अवरुद्ध न हो। – paleozogt

1

आप हैंडल से पढ़ने के लिए async I/O का उपयोग कर सकते हैं, जैसे ReadFileEx() WIN32 कॉल। इनपुट की अनुपस्थिति में पढ़ने को समाप्त करने के लिए CancelIo() का उपयोग करें। http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx

+1

कि अगर संभाल एक गुमनाम पाइप करने के लिए है काम नहीं करेगा - के रूप में यह उदाहरण सवाल में देने में किया जाएगा। अज्ञात पाइप के साथ ओवरलैप (async) I/O संभव नहीं है I –

संबंधित मुद्दे

 संबंधित मुद्दे