2012-06-12 5 views
6

में समानांतर प्रसंस्करण मुझे यकीन नहीं है कि मैं जो प्रोग्राम लिख रहा हूं, उसमें एसिंक्रोनस कार्यों को संभालने के बारे में कैसे जाना है और मुझे उम्मीद है कि कोई और अनुभवी मुझे कम से कम सही दिशा में इंगित कर सकता है।लिनक्स

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

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

इसके अतिरिक्त, मैं पहले से ही किसी भी क्रॉस संकलन समस्याओं से बचने के लिए बड़े माध्यमिक पुस्तकालयों से दूर रहना चाहता हूं। किसी सुझाव के लिए अग्रिम धन्यवाद।

+2

आप इसे नई प्रक्रिया में क्यों नहीं चलाते? फिर सॉकेट पर संवाद करें? – Hassan

+0

मैं उन्नत लिनक्स प्रोग्रामिंग का उपयोग अपनी मार्गदर्शिका के रूप में कर रहा था ... इसमें क्लोन() फ़ंक्शन शामिल नहीं है। उचित तकनीक लगता है –

+0

हो सकता है। या यह ['सिस्टम()'] हो सकता है (http://www.cplusplus.com/reference/clibrary/cstdlib/system/)। उस पर भी एक नज़र डालें। – Hassan

उत्तर

1

स्टीव के उत्तर की मूल विधि लें लेकिन इनिट (8) और नामित पाइप को छोड़ दें।

fork() एक बच्चा जिसमें आपका कैमरा कोड है और नियमित पाइप या डोमेन सॉकेट के माध्यम से संवाद करता है। माता-पिता में सिगचल के लिए सिग्नल हैंडलर कोड करें। अगर बच्चे wait() से रिटर्न कोड के कारणों से पूछताछ करता है। अगर यह अपने आप पर सफाई हो जाती है और फिर इसे पुनरारंभ करें; अगर यह सामान्य रूप से समाप्त होता है तो उस मामले में उचित क्या होता है। आप जिस भी आईपीसी को चुनते हैं उसके माध्यम से बच्चे के साथ संवाद करें। इससे आपको init और डोमेन सॉकेट या पाइप की तुलना में बच्चे पर अधिक नियंत्रण मिलता है, विशेष रूप से, एफआईएफओ के फंकी अर्थशास्त्र के साथ गड़बड़ करने से माता-पिता और बच्चे के बीच संवाद करना और संवाद करना आसान हो जाएगा।

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

+0

कैमरा कोड काम करता है ... शब्दों की मेरी पसंद खराब थी। उदाहरण के लिए यदि कोई कैमरा कनेक्ट नहीं है तो कैमरा थ्रेड लौटाता है और किसी भी कारण से प्रोग्राम में सेगमेंटेशन गलती शुरू होती है। क्लोन() फ़ंक्शन पर आपकी राय क्या है? –

+0

क्लोन आपके लिए कुछ भी नहीं करने जा रहा है। धागे और कांटा दोनों क्लोन के आसपास सिर्फ रैपर हैं। यदि आपको उनके साथ समस्याएं आ रही हैं तो नीचे एक स्तर कम करना आपकी समस्या का समाधान नहीं करेगा। शायद आपको अपने थ्रेड कोड की मूल बातें किसी अन्य प्रश्न में पोस्ट करनी चाहिए। आप एक बहुत ही सरल त्रुटि बना रहे हैं। – Duck

+0

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

3

आपकी समस्या कई प्रक्रियाओं के लिए क्लासिक केस की तरह लगती है, जो किसी प्रकार के इंटर-प्रोसेस संचार (आईपीसी) से संचार करती है।

कैमरे की अपनी प्रक्रिया होनी चाहिए, और यदि वह प्रक्रिया मर जाती है, तो मुख्य प्रक्रिया में कोई समस्या नहीं होनी चाहिए। आप init(8) प्रक्रिया भी कैमरा प्रक्रिया का प्रबंधन कर सकते हैं; जो किसी भी कारण से मरने पर प्रक्रिया को स्वचालित रूप से पुनरारंभ कर सकता है।

आप एक नामित पाइप स्थायी रूप से सेट अप कर सकते हैं, और फिर विफलता के बाद इसे फिर से चालू करने पर कैमरा प्रक्रिया इसे फिर से खोल सकती है।

http://en.wikipedia.org/wiki/Named_pipe

मैं StackOverflow खोज की है और नामित पाइप बनाम की चर्चा पाया:

http://www.tldp.org/LDP/lpg/node15.html

मैं विकिपीडिया पृष्ठ से इस पाया:

यहाँ नामित पाइप के बारे में कुछ प्रलेखन है सॉकेट:

IPC performance: Named Pipe vs Socket

+0

यूनिक्स और विंडोज दस्तावेज़ यूनिक्स पाइप के बारे में बहुत गलत जानकारी है। 'पॉपन' एक सिस्टम कॉल नहीं है, पाइप 2-तरफा (लिनक्स पाइप नहीं हैं) की गारंटी नहीं है और 'मोनोड' विशेष फाइलों के लिए है, न केवल पाइप के रूप में, इस दस्तावेज़ को भ्रामक रूप से दावा करता है। – Dave

+0

वाह, जो एक त्वरित Google खोज के खतरे दिखाता है और एक दस्तावेज़ को जल्दी से स्किम करता है। मैं एक बुरा लिंक पोस्ट करने के लिए सभी से माफी माँगता हूं। मैं इसे अभी अपने उत्तर से संपादित कर दूंगा। – steveha

+0

आपकी मदद के लिए धन्यवाद –

0

मैंने धागे की कोशिश की है, लेकिन कैमरा थ्रेड में कोई भी समस्या पूरी प्रक्रिया को मारने लगती है।

जब आप पूरी प्रक्रिया को मारते हैं, वास्तव में क्या होता है?

मैंने आपको यह बताया कि आप उपरोक्त समस्या को डीबग करने से बेहतर हैं, बग को एक फोर्क प्रक्रिया में दूर लपेटने की कोशिश करने से बेहतर हैं। एक अविश्वसनीय कैमरे के साथ एक विश्वसनीय कोर सिस्टम की तुलना में, आपके पास एक विश्वसनीय कैमरा सहित एक विश्वसनीय प्रणाली होगी।

+0

एक वापसी 0; एक सेगमेंटेशन गलती पेश करता है –

+0

@CountZero: और उस समय स्टैक पर जीडीबी क्या कहता है? कोड की कौन सी पंक्ति seg गलती का कारण बनती है? –