2008-09-29 9 views
11

मेरे पास एक popen() फ़ंक्शन है जो "tail -f sometextfile" निष्पादित करता है। फिलस्ट्रीम में डेटा के रूप में स्पष्ट रूप से मैं fgets() के माध्यम से डेटा प्राप्त कर सकते हैं। अब, यदि पूंछ से कोई नया डेटा नहीं आता है, तो fgets() लटकता है। मैंने कोई फायदा नहीं हुआ आतंक() और फीफ() की कोशिश की। मैं कैसे सुनिश्चित कर सकता हूं कि fgets() डेटा को पढ़ने की कोशिश नहीं करता है जब फ़ाइल स्ट्रीम में कुछ नया नहीं है?फ़ाइल स्ट्रीम में कोई नया डेटा नहीं होने पर fgets ब्लॉक को कैसे रोकें

सुझाव में से एक का चयन किया गया था()। चूंकि यह विंडोज प्लेटफार्म चयन के लिए काम नहीं करता है क्योंकि यह काम नहीं करता है क्योंकि अनाम पाइप इसके लिए काम नहीं कर रहे हैं (this post देखें)।

उत्तर

0

मैं सी पुस्तकालय के बजाय IO के लिए POSIX फ़ंक्शन का उपयोग करूंगा, आप select या poll का उपयोग कर सकते हैं।

0

आप निम्न स्तर के आईओ कार्यों (खुले(), पढ़ा(), आदि का उपयोग करके कुछ और अंतराल पढ़ने की कोशिश कर सकते हैं, जैसे पूंछ स्वयं करता है। जब पढ़ने के लिए और कुछ भी नहीं है, तो पढ़ें() शून्य देता है, लेकिन फिर भी FILE * फ़ंक्शंस के विपरीत अगली बार और पढ़ने की कोशिश करेगा।

+0

यह सिर्फ एक उदाहरण था। विचार डेटा खींचना और एक म्यूटेक्स ऑब्जेक्ट के माध्यम से फ्लैश इंस्टेंस में पास करना है। – SinisterDex

15

fgets() एक अवरुद्ध पढ़ना है, यदि डेटा नहीं है तो डेटा उपलब्ध होने तक प्रतीक्षा करना है।

आप select(), poll(), या epoll() का उपयोग करके एसिंक्रोनस I/O निष्पादित करना चाहते हैं। और फिर डेटा उपलब्ध होने पर फ़ाइल डिस्क्रिप्टर से एक पठन करें।

इन कार्यों FILE* संभाल की फ़ाइल वर्णनकर्ता, के द्वारा प्राप्त का उपयोग करें: int fd = fileno(f);

+1

निश्चित रूप से चयन करें() - यदि आपके पास फ़ाइल है * और आपको फ़ाइल डिस्क्रिप्टर की आवश्यकता है, तो fileno() का उपयोग करें। यदि आपके पास फ़ाइल डिस्क्रिप्टर है और आपको FILE * की आवश्यकता है, तो fdopen() का उपयोग करें। – plinth

+0

अच्छा सुझाव, fileno शामिल करने के लिए संपादित। – Sufian

+0

दुर्भाग्यवश, मुझे लगता है कि चयन() विंडोज के तहत पाइप पर काम नहीं करता है। – Roddy

25

लिनक्स (या किसी भी यूनिक्स-y ओएस), आप() popen द्वारा इस्तेमाल किया अंतर्निहित फ़ाइल वर्णनकर्ता गैर होने के लिए चिह्नित कर सकते हैं में अवरुद्ध।

#include <fcntl.h> 

FILE *proc = popen("tail -f /tmp/test.txt", "r"); 
int fd = fileno(proc); 

int flags; 
flags = fcntl(fd, F_GETFL, 0); 
flags |= O_NONBLOCK; 
fcntl(fd, F_SETFL, flags); 

यदि कोई इनपुट उपलब्ध नहीं है, तो fgets EWOULDBLOCK को गलत सेट के साथ NULL वापस कर देगा।

0

मैंने धागे का उपयोग करके मेरी समस्याओं का समाधान किया, विशेष रूप से _beginthread , _beginthreadex

+1

यदि आपने अपने प्रश्न का उत्तर दिया है, तो कृपया इसे उत्तर के रूप में सेट करें और संभवतः अपना समाधान पोस्ट करें। –

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