2012-03-28 13 views
8

मैं कंसोल से अपने प्रोग्राम को wget -b जैसे अलग करने में सक्षम होना चाहता हूं। एक कोड टुकड़ा की तरहसी # बंद मानक

static void Main(string[] args) 
{ 
    var settings = new Settings(args); 
    if (settings.Background) 
    { 
     /*Tell the user what's going on.*/ 
     System.Console.WriteLine("Detatching from console. The program will still be running."); 
     System.Console.Out.Close(); 
    } 
    /*do work then exit.*/ 
} 

लेकिन System.Console.Out.Close(); देखने के सही काम नहीं कर रहा है हो सकता है।

स्पष्टीकरण के लिए, "सही बात" है, इस प्रोग्राम को कंसोल से चलाते समय, प्रॉम्प्ट फिर से दिखाना चाहिए। या, इस प्रोग्राम को explorer.exe से चलाते समय, कंसोल विंडो बंद होनी चाहिए।

अगर मुझे स्पष्ट नहीं है तो कृपया मुझे बताएं।

+0

बस यह सुनिश्चित करने के लिए कि मैं आपका प्रश्न समझ गया हूं: यदि आप cmd-window में yourprogram.exe टाइप करते हैं तो एक नया दिखाई देना चाहिए। यदि आप एक्सप्लोरर में एप्लिकेशन को डबल क्लिक करते हैं तो आप कंसोल बंद करना चाहते हैं? आप अपने आवेदन के साथ क्या करना चाहते हैं? –

+0

कंसोल के बिना एक कंसोल अनुप्रयोग? इसका उत्तर देखने के लिए इंतजार नहीं कर सकता ... –

+1

यदि आप पृष्ठभूमि में रहते हुए लंबे समय तक चलने वाले एप्लिकेशन को चाहते हैं, तो आप विंडोज़ सेवा चाहते हैं। यदि आप समय-समय पर अपना आवेदन लॉन्च करना चाहते हैं तो आप इसे कार्य शेड्यूलर के साथ लॉन्च करने पर विचार कर सकते हैं। – jlafay

उत्तर

1

wget के लिए स्रोत जो आप संदर्भित करते हैं here उपलब्ध है। आप देखेंगे कि mswindows.c लाइनों में 1 9 3 - 314, एक कांटा प्रक्रिया लागू की गई है। उन्होंने wget का एक नया उदाहरण बनाया और इसे एक ही पैरामीटर पास कर दिया।

टिप्पणी जानकारीपूर्ण भी हैं:

विंडोज कांटा का समर्थन नहीं करता() कहते हैं; इसलिए हम उसी तर्क के साथ Wget की एक और प्रतिलिपि बनाकर नकली बनाते हैं जिसके साथ हमें बुलाया गया था।

और लाइन 102 पर:

विंडोज 9x के तहत, अगर हम एक 16-बिट प्रक्रिया से शुरू किया गया ... माता पिता प्रक्रिया तुरंत फिर से शुरू करना चाहिए। एनटी के तहत ... यह एक व्यर्थ संकेत है क्योंकि माता-पिता हमारे लिए फिर से शुरू होने से पहले समाप्त होने का इंतजार करेंगे।

संक्षिप्त उत्तर "ऐसा मत करो।"

+0

हां - आप इसे नकली बना सकते हैं या बहुत करीब आ सकते हैं, लेकिन यह बहुत सख्ती से 'प्रोत्साहित नहीं किया गया' –

+0

क्या आप एक और कार्यान्वयन के बारे में सोच सकते हैं? –

+0

यदि आपको मुझसे कोई फर्क नहीं पड़ता है - कंसोल में कुछ प्रिंट करने/वापस करने का उद्देश्य क्या है ... कंसोल का बाकी कुछ भी करता है? दो हिस्सों को अलग करना समझ में आता है? क्या एक चल रही सेवा होगी, जो एक कमांड लाइन घटक कमांड भेज सकता है और फिर समझ में आता है? –

1

किसी भी कंसोल ऐप के लिए 3 चैनल खुले हैं: STDIN, STDOUT, STDERR। पारंपरिक रूप से कंसोल को रिलीज़ करने के लिए ऐप के लिए सभी 3 को बंद करने की आवश्यकता है।

विंडोज़ में ऐसा करने के लिए एपीआई विधि प्रतीत होती है: FreeConsole ... और pinvoke.net

संपादित करें: एक और एसओ पोस्ट कहता है कि पृष्ठभूमि प्रक्रिया शुरू किए बिना यह संभव नहीं है: How to make a windowless/command-line application return but continue executing in background? ... यूनिक्स में यह fork(); के साथ पर्याप्त होगा।

+0

यह काम नहीं करता है। 'स्थिर शून्य मुख्य (स्ट्रिंग [] तर्क) {System.Console.Out.Close(); System.Console.In.Close(); System.Console.Error.Close(); System.Console.WriteLine ("detatched।");} 'दिखाता है कि कंसोल अलग नहीं है। –

+0

मैंने 'फ्रीकंसोल 'की कोशिश की। ऐसा लगता है * लगभग * काम। अब मैं इसे मुक्त करने के बाद मानक आउट करने के लिए कंसोल का उपयोग नहीं कर सकता, लेकिन कमांड दुभाषिया को अभी भी कंसोल वापस नहीं मिलता है। –

+0

@LimitedAtonement ने cmd.exe चलाकर अपना एप्लिकेशन शुरू किया, फिर एप्लिकेशन चलाया? खोल पर वापस जाने के लिए, आपको उसी कंसोल से जुड़े cmd.exe की एक प्रति की आवश्यकता होगी। –

0

स्पष्टीकरण के लिए, "सही बात" है, इस प्रोग्राम को कंसोल से चलाते समय, प्रॉम्प्ट फिर से दिखाना चाहिए। या, इस प्रोग्राम को explorer.exe से चलाते समय, कंसोल विंडो बंद होनी चाहिए।

ऐसा नहीं है कि आप "कंसोल विंडो [से] बंद करना चाहते हैं", आप चाहते हैं कि यह अस्तित्व में न हो। आप जो चाहते हैं उसे प्राप्त करने का एक बहुत ही आसान तरीका है: कंसोल ऐप न बनाएं। :-)

यदि कमांड लाइन से बिल्डिंग, CSC /target:winexe ... का उपयोग करें। यह एक विंडोज प्रोग्राम बनाएगा जो किसी भी कमांड लाइन से कभी भी संबद्ध नहीं होगा।

+0

यह बिल्कुल मेरा इरादा नहीं है। मैं थोड़ी देर के लिए एक कंसोल चाहता हूँ, तो मैं इसे से अलग करना चाहता हूँ। इस आवश्यकता को स्पष्ट करने के लिए मैंने थोड़ी देर पहले इस सवाल को संपादित किया था। कोड उदाहरण अब और अधिक स्पष्ट हो सकता है। –

1

बजाय एक कंसोल अनुप्रयोग बनाने और फिर FreeConsole करने के लिए कॉल के साथ समस्या हो, आप एक सामान्य Windows ऐप बनाने के द्वारा आप क्या चाहते हैं पाने के लिए सक्षम हो सकता है एक जीयूआई, AllocConsole/AttachConsole/FreeConsole का उपयोग करता है के रूप में की जरूरत के बिना।

इस तरह आपके पास एक ऐप है जो पृष्ठभूमि में चला सकता है लेकिन यह आवश्यकतानुसार एक कंसोल विंडो दिखा और छुपा सकता है। हालांकि जहां तक ​​मुझे याद है, इन कंसोल विंडोज़ और सामान्य विंडोज कमांड के बीच कुछ अंतर हैं, इसलिए यह आपके इच्छित काम के लिए काम नहीं कर सकता है।

+0

उत्तर के लिए धन्यवाद। यह निश्चित रूप से एक नई कंसोल विंडो खोलने का एक विचार है, लेकिन मैं केवल मौजूदा कंसोल विंडो से बातचीत करने की उम्मीद कर रहा था। मुझे नहीं लगता कि मुझे 'फ्रीकंसोल' के साथ समस्याएं आ रही हैं; यह "चाहिए" के रूप में अभिनय कर रहा है। मुझे 'AllocConsole', आदि के बारे में पता है। समस्या वास्तव में यह है कि कमांड दुभाषिया (cmd या powerhell) कमांड दुभाषिया पर लौटने से पहले * प्रक्रिया * समाप्त होने के लिए प्रतीक्षा करता है। एक बार फिर धन्यवाद। –

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