कमांड लाइन के माध्यम से प्रोग्राम को संदेश भेजें

मेरे पास यह प्रोग्राम है, हम इसे होस्ट करेंगे। होस्ट सभी प्रकार की अच्छी चीजें करता है, लेकिन इसे कमांड लाइन चल रहा है के माध्यम से इनपुट स्वीकार करने में सक्षम होना चाहिए। इसका मतलब है कि इसे किसी अन्य तरह से अपना अन्य प्रक्रिया डेटा भेजना है और फिर छोड़ना है। उदाहरण के लिए, मुझे ऐसा करने में सक्षम होना चाहिए:

./Host --blahblah 3 6 3 5

इसे किसी भी तरह से होस्ट में होस्ट में कुछ फ़ंक्शन कॉल करना चाहिए

handleBlahBlah(int x1, int y1, int x2, int y2){
  //do some more sweet stuff
}

होस्ट एक सी प्रोग्राम है, और कई उदाहरणों का समर्थन करने की आवश्यकता नहीं है।

इसका एक उदाहरण अमरोक संगीत खिलाड़ी है। अमरोक दौड़ने और खेलने के साथ, आप "अमारोक - पॉज़" टाइप कर सकते हैं और यह संगीत को रोक देगा।

मुझे लिनक्स या विंडोज में ऐसा करने में सक्षम होना चाहिए। पसंदीदा लिनक्स।

इसे लागू करने का सबसे साफ तरीका क्या है?

0
ro fr bn
क्या आप प्रोग्राम पहले ही चल रहे हैं जब आप इसे तर्क पारित करना चाहते हैं? यह किस ओएस के लिए प्रोग्राम किया जा रहा है?
जोड़ा लेखक Adam Haile, स्रोत

6 उत्तर

यदि आप विंडोज़ पर थे, तो मैं आपको संदेश प्राप्त करने के लिए एक छिपी हुई विंडो का उपयोग करने के लिए कहूंगा, लेकिन चूंकि आपने ./ का उपयोग किया है, मुझे लगता है कि आप यूनिक्स-आधारित कुछ चाहते हैं।

उस स्थिति में, मैं एक नामित पाइप के साथ जाऊंगा। सूर्य के नामित पाइप के बारे में एक ट्यूटोरियल उपयोगी हो सकता है।

कार्यक्रम शायद पाइप बनायेगा और सुनो। आपके पास एक अलग कमांड लाइन स्क्रिप्ट हो सकती है जो पाइप खोलती है और इसके लिए इसके कमांड लाइन तर्कों को प्रतिबिंबित करती है।

आप एक अलग स्क्रिप्ट का उपयोग करने के बजाय कमांड लाइन भेजने का समर्थन करने के लिए अपने प्रोग्राम को कर सकते हैं संशोधित कर सकते हैं। आप उस मामले में एक ही मूल बात करेंगे। आपका प्रोग्राम इसके कमांड लाइन तर्कों को देखेगा, और यदि लागू हो, तो पाइप को प्रोग्राम के "मुख्य" उदाहरण पर खोलें, और तर्कों को भेज दें।

0
जोड़ा
+1 मैंने इस नामित पाइप पद्धति का कई बार उपयोग किया है और यह काफी अच्छी तरह से काम करता है। मैंने उन मामलों के लिए यूनिक्स सॉकेट का भी उपयोग किया है जहां मुख्य कार्यक्रम को कमांड लाइन स्क्रिप्ट/प्रोग्राम में डेटा वापस करने की आवश्यकता है।
जोड़ा लेखक jschmier, स्रोत

तो, मैं यहां बिंदु खो सकता हूं, लेकिन एक सी प्रोग्राम के मुख्य समारोह में बहस करके दो तर्क लेते हैं; argc, तर्कों की संख्या (कम से कम एक), और argv (या तर्क वेक्टर), तर्क सूची की एक गिनती। आप केवल तर्कों के माध्यम से विश्लेषण कर सकते हैं और सही विधि को कॉल कर सकते हैं। उदाहरण के लिए:

 int main(int argc, *argv[])
 {
     /*loop through each argument and take action*/
      while (--argc > 0)
      {
           printf(%s%s, *++argv, (argc > 1) ? " " : "");
      }
 } 

स्क्रीन पर सभी तर्क मुद्रित करेंगे। मैं कोई सी गुरु नहीं हूं, इसलिए मुझे उम्मीद है कि मैंने कोई गलती नहीं की है।

संपादित करें: ठीक है, वह कुछ और के बाद था, लेकिन सवाल संपादित होने से पहले यह वास्तव में स्पष्ट नहीं था। मेरे प्रतिनिधि पर कूदने की ज़रूरत नहीं है ...

0
जोड़ा

मैंने देखा है कि एक तकनीक है कि आपके असली प्रोग्राम के लिए आपका होस्ट प्रोग्राम केवल "खोल" हो। उदाहरण के लिए जब आप अपना आवेदन सामान्य रूप से लॉन्च करते हैं (उदा .: ./ होस्ट ), प्रोग्राम आपके कोड के "मुख्य ऐप" भाग में फंस जाएगा। जब आप अपना प्रोग्राम इस तरह से लॉन्च करते हैं जो सुझाव देता है कि आप चल रहे इंस्टेंस को सिग्नल करना चाहते हैं (उदाहरण: ./ होस्ट - भेजें-संदेश पुनरारंभ करें ), प्रोग्राम "संदेश प्रेषक" भाग में फोर्क करेगा तुम्हारा कोड। यह एक में दो ऐप्स होने जैसा है। एक और विकल्प जो कांटा का उपयोग नहीं करता है, होस्ट को पूरी तरह से "संदेश प्रेषक" ऐप बनाना है और अपना "मुख्य ऐप" एक अलग निष्पादन योग्य (उदाहरण: Host_core ) कि होस्ट अलग से लॉन्च हो सकता है।

आपके कार्यक्रम के "मुख्य ऐप" भाग को संदेशों को प्राप्त करने के लिए किसी प्रकार का संचार चैनल खोलना होगा, और "संदेश प्रेषक" भाग को उस चैनल से कनेक्ट करने और संदेशों को भेजने के लिए इसका उपयोग करने की आवश्यकता होगी। प्रक्रियाओं के बीच संदेश भेजने के लिए कई अलग-अलग विकल्प उपलब्ध हैं। कुछ सामान्य तरीकों में से कुछ पाइप और सॉकेट । आपके ओएस के आधार पर, आपके पास अतिरिक्त विकल्प उपलब्ध हो सकते हैं; उदाहरण के लिए, क्यूएनएक्स में चैनल हैं और बीओएस/हाइकू में BMessages है। आप एक ऐसी लाइब्रेरी भी ढूंढ सकते हैं जो इस कार्यक्षमता को अच्छी तरह से लपेटता है, जैसे कि lcm

0
जोड़ा

मैं या तो एक यूनिक्स सॉकेट या डी-बस । यदि आप यूनिक्स सॉकेट प्रोग्रामिंग से परिचित हैं और केवल कुछ ऑपरेशन चाहते हैं, तो सॉकेट का उपयोग करना तेज हो सकता है, जबकि डी-बस एक परिचित वस्तु-उन्मुख तरीके से कार्यक्षमता को लागू करने पर ध्यान केंद्रित करना आसान बना सकता है।

बीज की मार्गदर्शिका यूनिक्स आईपीसी पर विशेष रूप से देखें, विशेष रूप से यूनिक्स सॉकेट पर अध्याय।

0
जोड़ा

यदि इसे क्रॉस-प्लेटफ़ॉर्म होने की आवश्यकता है, तो हो सकता है कि आप चल रहे इंस्टेंस को एक टीसीपी पोर्ट पर सुनें, और उस आदेश को आप कमांड लाइन से आग लगाना चाहते हैं, उस पोर्ट को एक संदेश भेजें।

0
जोड़ा

यहां कोई भी नहीं कहता है: "आप यहां से नहीं जा सकते"।

कमांड लाइन केवल तभी उपलब्ध होती है जब आपका प्रोग्राम लागू होता था।

fillinthename के साथ संवाद करने के लिए fillinthename के साथ संवाद करने के लिए " fillinthename तर्क ..." का आह्वान करने का उदाहरण fillinthename चल रहा है केवल दो उदाहरणों का उपयोग करके पूरा किया जा सकता है कार्यक्रम जो एक-दूसरे के साथ संवाद करता है।

अन्य उत्तरों संचार प्राप्त करने के तरीकों का सुझाव देते हैं।

एक amarok प्रोग्राम की तरह किसी अन्य उदाहरण के अस्तित्व का पता लगाने की आवश्यकता है यह जानने के लिए कि किस भूमिका को खेलना चाहिए, इसकी प्रमुख भूमिका लगातार संदेश रिसीवर/सर्वर, या एक शॉट की मामूली भूमिका संदेश प्रेषक।

शब्द fillinthename वास्तव में प्रदर्शित करने के लिए संपादित किया गया है।

0
जोड़ा