2011-09-02 14 views
5

यह एक कंप्यूटिंग सिस्टम 101 प्रश्न की तरह लगता है, लेकिन मैं stumped हूँ।आंतरिक रूप से कैप्चर/रीडाउट रीडायरेक्ट?

मैं अपने स्वयं के प्रोजेक्ट बी में सी/सी ++ प्रोजेक्ट ए से मौजूदा कोड को एकीकृत कर रहा हूं। ए और बी दोनों को एक निष्पादन योग्य, थ्रेडेड प्रक्रिया में जोड़ा जाएगा। प्रोजेक्ट ए का कोड आउटपुट के लिए printf का व्यापक उपयोग करता है। यह ठीक है, लेकिन मैं अपने आउटपुट को अपने बफर में भी कैप्चर करना चाहता हूं। प्रिंटफ कॉल ने इसे लिखने के बाद क्या कोई तरीका है जिसे मैं stdout से पढ़ सकता हूं? मैं प्रक्रिया या पाइप कांटा नहीं कर सकता। और मतदान() stdout, या डुप्लिकेट() के लिए मेरे प्रयासों में सफल नहीं हुआ है (मैं यहां कुछ गलत कर रहा हूं)।

+0

क्या आप बी में ए के आउटपुट को पाइप नहीं कर सकते? ('$ commandprompt> ./A |/B')। मुझे लगता है कि उनमें से दोनों निष्पादन योग्य हैं और ए बी –

+0

से पहले चला सकता है जैसे लगता है कि आप उन्हें सीप्रेट एक्जिक्यूटिव के रूप में रखना चाहते हैं, फिर रनटाइम पर कनेक्ट करने के लिए एक पाइप का उपयोग करें। –

+0

दुर्भाग्य से, नहीं। ए और बी को एक एकल निष्पादन में लिंक करना होगा। – MapMaker

उत्तर

4

आप freopen उपयोग कर सकते हैं वर्णनकर्ता बदलने के लिए में बना लिया है।

#include<stdio.h> 

main(int argc, char** argv) { 
    FILE *fp = freopen("output.txt", "w", stdout); 
    printf("Hello\n"); 
    fclose(fp); 
} 

आप चलाते हैं कि आप output.txt और कुछ भी नहीं में printf उत्पादन देखेंगे अपनी स्क्रीन के लिए जाना जाएगा।

अब आप डेटा को पढ़ने के लिए फ़ाइल खोल सकते हैं या आप mmap को अपनी मेमोरी स्पेस में भी कर सकते हैं और इसे इस तरह संसाधित कर सकते हैं।

0

एक बार यह खत्म हो जाने के बाद, यह चला गया है। यदि आप इसे सभी को एक निष्पादन योग्य में संकलित करना चाहते हैं, तो आपको खोज के साथ कोड के माध्यम से जाना होगा और उन सभी printf कॉल को अपनी स्ट्रीम में बदलना होगा, जहां आप उन्हें कॉपी कर सकते हैं और फिर उन्हें पास कर सकते हैं stdout पर।

+0

निक, यह वास्तव में था काम के आसपास मैं लागू किया है, लेकिन उम्मीद थी कि मैं बस कुछ सर्वेक्षण के साथ कुछ गलत कर रहा था() और डुप्लिकेट()। आह ठीक है, आगे बढ़ने का समय! जवाब के लिए धन्यवाद। बीटीडब्ल्यू मुझे आपका आइकन पसंद है :) – MapMaker

+0

यह फ्लश हो गया है और इसकी बात करने के लिए चला गया है। पाइप और स्टडआउट का पूरा विचार यह है कि एप्लिकेशन इन चीजों को चारों ओर नहीं रखते हैं; वे उतना ही बफर करते हैं जितना उन्हें चाहिए, फिर तुरंत इससे छुटकारा पाएं। इस तरह एक साथ पाइपिंग अनुप्रयोगों में ज्यादा मेमोरी नहीं होती है। इसे पाने का कोई तरीका नहीं है यदि आप चीजें डिज़ाइन करते हैं ताकि सभी पिछले आउटपुट बाद में उपयोग के लिए चिपक जाए। –

+0

आप हमेशा प्रिंट करें (...) fprintf (myfile, __VA_ARGS __) ' –

2

इससे पहले कि आप() printf, आप fd 1 बंद कर सकता है, और dup2() एक पाइप कि आप fd 1.

+0

... और एफडी 1 -' dup2' को बंद करने की कोई आवश्यकता नहीं है, यह आपके लिए भी करेगी। – dragonroot

1

उल्लेख नहीं है: अब एक आसान यू-स्ट्रीम सी स्रोत कोड लाइब्रेरी है जो stdout और stderr को बहुत ही मामूली रीडायरेक्ट करता है। और आप उन्हें कई गंतव्यों में भी आसानी से रीडायरेक्ट कर सकते हैं। और, आप अपनी खुद की धाराएं बना सकते हैं इसके अलावा इसका उपयोग उसी तरह से किया जा सकता है जैसे स्टडआउट और स्टडरर व्यवहार।

यू-स्ट्रीम सी पुस्तकालय की तलाश करें ... वास्तव में आसान।

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