2009-04-03 16 views
8

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

सी कार्यक्रम outputs (printf के माध्यम से) को महत्व देता है जैसे:

1, 2, 3, 4, 5, 6 
7, 8, 9, 10, 11, 12 
... 

पर्ल कार्यक्रम आदेश में इस डेटा को संसाधित करने में STDIN के लिए एक लाइन के आधार पर इंतजार कर अनंत लूप में बैठता है:

while ($line = <STDIN>) 
{ 
    chomp($line) # Line should now read "1,2,3,4,5,6" 
    # Process data 
} 

मैं इन दो प्रक्रियाओं को वास्तविक समय में संवाद करना चाहता हूं। मानक बैश पाइप काम नहीं करते हैं (उदा। प्रक्रिया 1 | प्रक्रिया 2) क्योंकि पर्ल प्रोग्राम इनपुट को संसाधित करने से पहले खत्म करने के पहले कार्यक्रम के लिए इंतजार कर रहा है।

क्या किसी के पास इस समस्या के समाधान के लिए कोई विचार, सुझाव या अंतर्दृष्टि है? आपका अग्रिम में ही बहुत धन्यवाद!

+0

सख्ती से बोलते हुए, इसका "वास्तविक समय" – andersoj

+0

से कोई लेना-देना नहीं है, आप बिल्कुल सही हैं, मैंने इसे जल्दी से लिखा है और यह समझाने के लिए एक बेहतर तरीका नहीं सोच सकता कि मैं इन प्रक्रियाओं को कैसे काम करना चाहता हूं। समवर्ती एक बेहतर विकल्प हो सकता है। –

+0

समवर्ती बहुत बेहतर है, और इसे ठीक करने के लिए आपके पास एक संपादन बटन है। – derobert

उत्तर

16

पाइप्स इसके लिए ठीक होना चाहिए; जब आपको अपने सी प्रोग्राम के आउटपुट को पर्ल स्क्रिप्ट में वृद्धिशील रूप से उपलब्ध कराने के लिए फ़्लश किया जाता है तो आपको केवल नियंत्रण करने की आवश्यकता होती है। आप fflush() का उपयोग कर सी प्रोग्राम में ऐसा कर सकते हैं, जो आपके सी प्रोग्राम से बफर को धक्का दे सकता है ताकि पर्ल प्रोग्राम इसे पढ़ सके।

पाइप के बारे में कुछ भी अंतर्निहित नहीं है जो पर्ल प्रोग्राम को सी आउटपुट के उत्पादन को संसाधित करने से पहले लिखने के लिए इंतजार कर सकता है। आपका पर्ल प्रोग्राम लिखा है इतना है कि यह एक समय में STDIN एक पंक्ति संसाधित करता है:

while ($line = <STDIN>) { ... } 

<> इस संदर्भ में STDIN से एक पंक्ति पढ़ता है, लेकिन वहाँ नहीं है यदि उपलब्ध यह एक है जब तक रोकेंगे। सी प्रोग्राम से fflush() पर कॉल करने से यह होगा।

Wikipedia article on Pipelines पर एक नज़र डालें। कार्यान्वयन अनुभाग एक संक्षिप्त विवरण देता है कि पाइप कैसे बफर किए जाते हैं, जो आपको समझने में मदद करनी चाहिए कि आपकी प्रक्रियाएं कैसे संवाद करती हैं। पाइप्स प्रक्रियाओं के बीच समेकन की अनुमति देता है, और पाइप से पढ़ने और लिखने की प्रक्रियाओं को शेड्यूलर द्वारा अन्य प्रक्रियाओं की तरह प्रबंधित किया जाता है। यहां आपकी समस्या बफरिंग के साथ है।

+0

मैंने सोचा कि सी कार्यक्रमों ने जब भी एक नई लाइन मुद्रित की है तो सभी आउटपुट फ़्लश किए गए हैं। –

+0

आप इस उत्तर के साथ सही थे - मैंने एफएफएलश की भी खोज की थी लेकिन मैंने कभी इसे स्टडआउट पर इस्तेमाल करने का सोचा नहीं था।और पर्ल कार्यक्रम के व्यवहार की प्रकृति के कारण, मैंने इसे सी प्रोग्राम पर 'प्रतीक्षा' के लिए गलत समझा था। मैंने अपने printf कथन के बाद fflush (stdout) जोड़ा और यह बेकार ढंग से काम किया! धन्यवाद!! –

+0

@ क्रिस लुट्ज़, स्वचालित फ़्लश केवल तब होता है जब स्ट्रीम लाइन buffered मोड में होती है, जो आमतौर पर केवल तभी सच होती है जब स्ट्रीम tty पर खुलती है। एक बार stdout एक पाइप है, यह सबसे अच्छा प्रदर्शन के लिए पूरी तरह से buffered करने के लिए डिफ़ॉल्ट है। – RBerteig

5

सी प्रोग्राम को अपने आउटपुट बफर को स्पष्ट रूप से fflush() करना चाहिए, या एक पीटीआई का उपयोग करना चाहिए। उत्तरार्द्ध बहुत अधिक अजीब है लेकिन सी कोड को सरल रखता है। यदि यह आपके लिए अपरिचित है तो "मैन 3 एफएफएलश" आज़माएं।

+0

एक पीटीआई का उपयोग ओवरकिल है; आउटपुट को फ़्लश करना महत्वपूर्ण है यदि सी कोड में stdio का उपयोग करना (और सामग्री (यदि सीधे लिखना) का उपयोग कर सामग्री नहीं है)। –

+0

एक पीटीई केवल तभी जरूरी है जब दोनों प्रक्रियाओं को बातचीत करनी चाहिए, और फिर वास्तव में केवल एक या दोनों को गैर-मानव को इंटरैक्टिंग पार्टी के रूप में अनजान होना चाहिए। Ptys यूनिक्स जैसी प्लेटफार्मों के बाहर भी बहुत पोर्टेबल नहीं हैं। – RBerteig

+0

मैं मानता हूं कि पीटीआई अधिक है, लेकिन यह हर नई लाइन के बाद सी प्रोग्राम को ऑटोफ्लश करने के लिए चालित करता है। उस अर्थ में (और उस अर्थ में अकेले!) यह सी प्रोग्राम को अधिक जटिल वातावरण की कीमत पर सरल बनाता है। –

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

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