2010-01-09 13 views
8

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

पॉपन - अच्छा और आसान, फ़ाइल लौटाता है * हर जगह उपभोग करना आसान है।

तो एक Windows कार्यक्रम में इस्तेमाल किया, _popen फ़ंक्शन गलत फ़ाइल सूचक है कि कार्यक्रम अनिश्चित काल के लिए जवाब देना बंद हो जाते: लेकिन यहाँ क्या MSDN have to say about _popen है। _popen कंसोल एप्लिकेशन में ठीक से काम करता है। Windows एप्लिकेशन जो इनपुट और आउटपुट को रीडायरेक्ट करता है, बनाने के लिए, को रीडायरेक्ट इनपुट और आउटपुट के साथ प्लेटफ़ॉर्म एसडीके में देखें।

और इसलिए पॉपन प्रश्न से बाहर है (संपादित करें: क्योंकि मैं अपने कोड को जीयूआई एप्लिकेशन में काम करना चाहता हूं)। ऐसा करने का विंडोज तरीका मेरी राय में बदसूरत और वर्बोज़ है। मैं मंच विशिष्ट स्पॉन कोड के साथ रह सकता था लेकिन मैं कम से कम I/O कोड समान होना चाहता हूं। यहां, हालांकि, मैंने WinAPI HANDLE एस और सी FILE*, और int फ़ाइल डिस्क्रिप्टर के बीच एक दीवार मारा। HANDLE से FILE* या int fd या इसके विपरीत "कन्वर्ट" करने का कोई तरीका है? (Google ने मुझे एक बार फिर से असफल कर दिया, मेरे द्वारा किए गए सभी खोजशब्दों का उपयोग अधिक से अधिक है)

क्या छोटी प्लेटफ़ॉर्म-विशिष्ट कोड के साथ पूरी चीज़ करने का कोई बेहतर तरीका है?

बाहरी पुस्तकालय प्रश्न से बाहर नहीं हैं, हालांकि निर्भरता रखरखाव एक दर्द है, खासकर कई प्लेटफार्मों पर इसलिए मैं निर्भरताओं को कम करना चाहता हूं। मुझे बूस्ट में ऐसी लाइब्रेरी भी नहीं मिली।


बस रिकॉर्ड के लिए, अंत में मेरे लिए क्या काम किया। विंडोज़/एमएसवीसी पर, CreatePipe() + CreateProcess()here के रूप में _open_osfhandle() का उपयोग करके, _fdopen() का उपयोग करके FILE* प्रक्रिया इनपुट और आउटपुट के लिए के साथ। लिनक्स/जीसीसी पर, यहां कुछ नया नहीं है, pipe() एस बना रहा है; fork() फिर dup2() पाइप; exec(); प्रासंगिक फ़ाइल वर्णनकर्ताओं पर fdopen()। इस तरह, केवल प्रक्रिया कोडिंग कोड प्लेटफॉर्म पर निर्भर है (जो ठीक है, विंडोज़ के रूप में मैं अतिरिक्त STARTUPINFO पैरामीटर को नियंत्रित करना चाहता हूं), इनपुट और रीडिंग आउटपुट मानक FILE* और संबंधित कार्यों के माध्यम से किया जाता है।

+0

आप कहते हैं कि नहीं है, तो आप एक जीयूआई लिख रहे हैं या एक कंसोल ऐप। यदि उत्तरार्द्ध, popen() विंडोज पर काम करता है। –

उत्तर

2

सेल्सियस के लिए परिवर्तित खिड़कियों HANDLE रों के लिए फ़ाइल वर्णनकर्ता का उपयोग _open_osfhandlehttp://msdn.microsoft.com/en-us/library/bdts1c9x%28VS.71%29.aspx

संपादित करें: इस उदाहरण एक बार एक ऐसी ही समस्या के साथ अच्छी तरह से मुझे मदद मिली: http://www.halcyon.com/~ast/dload/guicon.htm

6

libexecstream एक भंवर दें। यह क्रॉस प्लेटफॉर्म है, और आपको सी ++ स्टाइल स्ट्रीम के रूप में असीमित रूप से एक प्रक्रिया के इनपुट, आउटपुट और त्रुटि धाराओं को फंसाने की अनुमति देता है।

मैंने इसे लिनक्स, डार्विन और विंडोज पर उपयोग किया है और ऐसा लगता है कि यह काम करता है। यह बहुत हल्का वजन है, इसलिए कम दर्द वाले परियोजनाओं में एकीकृत होता है, और इसमें एक खुली बीएसडी लाइसेंस है। मुझे नहीं लगता कि लाइब्रेरी का उपयोग करने के आसपास कोई रास्ता है (प्रत्येक प्लेटफॉर्म के लिए अपनी खुद की विविधताओं को लिखने के अलावा)।

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