2012-11-23 7 views
5

मैं कैसे निष्क्रिय stderr को सुनने और कालबैक में भेजने के लिए स्ट्रिंग के रूप में इसे प्राप्त करते हैं? मैंने stderr पढ़ने पर पोस्ट देखी हैं लेकिन मैं इसे सक्रिय रूप से पढ़ने के बजाय इसे सुनना चाहता हूं।कैसे कालबैक में भेजने के लिए C++/सी में stderr को सुनने के लिए?

पृष्ठभूमि: मेरे पास एक क्रॉस-प्लेटफ़ॉर्म टुकड़ा है जो तृतीय पक्ष लाइब्रेरी (libcurl) का उपयोग करता है जो stderr में verbose जानकारी आउटपुट करेगा। यह क्रॉस-प्लेटफ़ॉर्म टुकड़ा 1 से अधिक गैर-क्रॉस-प्लेटफ़ॉर्म अनुप्रयोगों द्वारा उपयोग किया जाना है।

मैं इन की जानकारी है, जो मैं फ़ाइल * libcurl के लिए उपलब्ध कराने के द्वारा कर सकते हैं लॉग ऑन करना चाहते हैं। लेकिन बजाय कि ऐसा करने का, मैं अगर मैं पर कब्जा कर सकते हैं (निष्क्रिय करने के लिए सुनो) स्ट्रिंग के रूप में stderr में उत्पादन देखते हैं, और कॉलबैक के माध्यम से बुला मुख्य आवेदन करने के लिए वापस भेजना चाहते हैं। इसका लाभ 1 है। मुख्य ऐप जो भी लॉगिंग टूल चाहता है उसका उपयोग कर एक लॉग रख सकता है। 2. यह इस टुकड़े को पार मंच बनाए रखेगा।

+0

देखते हैं कि यह एक http://stackoverflow.com/questions/5095839/redirect-from-stderr-to-another-file-descriptor – kellogs

+0

तो यह सी या C++ है फिर? – netcoder

+0

सी ++। लेकिन मैं बहुत अधिक उपयोग नहीं करता (क्योंकि मुझे यकीन नहीं था कि यह क्रॉस प्लेटफ़ॉर्म पर्याप्त है)। –

उत्तर

2

एक भी प्रक्रिया में ऐसा करने से एक छोटे से मुश्किल है, लेकिन आप शायद यह कर सकते हैं।

  • 1: freopen का उपयोग करना() यदि आप एक नाम की फ़ाइल के लिए अपने stderr अनुप्रेषित कर सकते हैं। आप एक ही हैंडल पर पढ़ने के लिए उस फ़ाइल को एक साथ खोल सकते हैं। तुम भी इतनी है कि आप इसे सही 2 संभाल से दूर पढ़ने के लिए सक्षम हो जाएगा stderr करने के लिए उत्पादन पर बफरिंग बंद करने के लिए stderr पर setvbuf() कॉल करने के लिए आवश्यकता हो सकती है। चूंकि इसे किसी फ़ाइल में लिखा जा रहा है, इसलिए आप इसे किसी भी समय पढ़ सकते हैं - जब यह सुविधाजनक हो। यूनिक्स फ़ंक्शन "चयन" वह है जिसे आप फ़ाइल की आवश्यकता होने पर अधिसूचित करना चाहते हैं। (fileno() भी देखें)।

  • 2: अधिक मुश्किल एक पाइप के अंत लिखने के रूप में सेटअप stderr होगा। Dup3() का उपयोग करके करने योग्य होना चाहिए, हालांकि यह बिल्कुल क्रॉस-प्लेटफार्म नहीं है (गैर-यूनिक्स ओएस के लिए)। यह भी आवश्यकता होगी कि एक 2 धागा अवरुद्ध किया जा रहा है अगर वे बहुत ज्यादा लिखने से लेखक को रोकने के लिए पाइप से पढ़।

तरह:

FILE *stream = freopen("stderr.out", "w", stderr); // Added missing pointer 
setvbuf(stream, 0, _IONBF, 0); // No Buffering 
FILE *input = fopen("stderr.out", "r"); 
fprintf(stderr, "Output to stderr dude\n"); 
//fflush(stderr); // You can explicitly flush instead of setting no buffering. 
char buffer[1024]; 
while (fgets(buffer, 512, input)) 
{ 
    printf(">>>%s\n", buffer); 
} 
संबंधित मुद्दे