2013-05-29 7 views
15

में लंबे समय तक चलने वाली बाहरी फ़ंक्शन कॉल को मेरे रूट प्रोग्राम में पॉज़िक्स दायरस्क्रिप्टर के माध्यम से बाहरी प्रक्रिया द्वारा प्रदान किए गए डेटा को पढ़ने की आवश्यकता है। एफडी कनेक्शन को बहुत लंबे समय तक (घंटे) रखा जाता है और दूसरी तरफ समय-समय पर मुझे डेटा पास करता है। तो मुझे लगातार डेटा स्ट्रीम को पढ़ने और संसाधित करने की आवश्यकता है।जंग में अवरुद्ध I/o को संभालने के लिए कैसे करें, या सामान्य

ऐसा करने के लिए, मैंने एक लूप लिखा जो libc::read() (वास्तव में रीडव) को डेटा पढ़ने और प्राप्त होने पर प्रक्रियाओं को पढ़ने के लिए कहता है। चूंकि यह पूरे शेड्यूलर को अवरुद्ध कर देगा, इसलिए मैं एक नए शेड्यूलर (task::spawn_sched(SingleThreaded)) पर एक कार्यवाही कर रहा हूं। यह तब तक ठीक काम करता है जब तक यह चलता है, लेकिन मुझे लूप को साफ करने के लिए कोई रास्ता नहीं मिल रहा है।

चूंकि लूप अधिकांश समय अवरुद्ध कर रहा है, इसलिए मैं बाहर निकलने के लिए लूप को सूचित करने के लिए पोर्ट/चैन का उपयोग नहीं कर सकता।

मैंने लूप कार्य को एक असफल लिंक किए गए कार्य का उपयोग करके इसे नीचे ले जाने की कोशिश की (लूप कार्य पर्यवेक्षित, इसके भीतर एक लिंक किए गए कार्य को जन्म दें और fail!() आईएनजी से पहले एक बंदरगाह पर सिग्नल की प्रतीक्षा करें और नीचे ले जाएं इसके साथ लूप कार्य)। यह टेस्ट मैचों में अच्छी तरह से काम करता है, लेकिन libc::read() बाधित नहीं है (कार्य पढ़ने खत्म होने से पहले विफल नहीं हुआ और यह कुछ समय में task::yield() पूरी करता है।

मैं libcore स्रोतों को देखकर बहुत कुछ सीखा है, लेकिन मैं नहीं कर पा रहे एक उचित समाधान खोजने के लिए।

  1. वहाँ एक (बच्चे) जंग में काम भले ही यह एक अवरुद्ध जैसे कुछ लंबे बाहरी समारोह कॉल कर रहा है पढ़ को मारने के लिए कोई तरीका है?
  2. वहाँ nonblocking पढ़ता है क्या करने के लिए एक रास्ता है पॉज़िक्स दायरस्क्रिप्टर पर ताकि जंग कार्य पर नियंत्रण रखती है?
  3. मैं संकेतों पर प्रतिक्रिया कैसे कर सकता हूं, ई। जी। SIGTERM यदि उपयोगकर्ता मेरे प्रोग्राम को समाप्त करता है। जंग में अभी तक sigaction() जैसा कुछ प्रतीत नहीं होता है?
+0

लगता है जैसे इस समय संभव नहीं है, लेकिन वहाँ async सुधार करने के लिए प्रयास चल रहे है मैं/हे: https://github.com/mozilla/rust/issues/4419 – Zargony

+0

अपडेट वहाँ गैर-अवरुद्ध I पर कर रहे हैं/ओ अब जंग 1.0 में? – jocull

+0

यह टिप्पणी बहुत बाद में है, लेकिन चूंकि प्रश्न के पास एक स्वीकार्य उत्तर नहीं है, इसलिए मैं इसे यहां डाल रहा हूं: 1.0 से आईओ कहानी काफी बदल गई है। वर्तमान में लिनक्स और विंडोज़ के लिए कर्नेल libs के आधार पर mio का उपयोग करके async i/o पर एक बड़ा ध्यान केंद्रित है (उन्हें बंद नहीं कर सकता)। जल्द ही कुछ वाक्यविन्यास-स्तरीय कार्यक्षमता हो सकती है। अधिक आम तौर पर, यदि एक वर्कर थ्रेड में वर्क लूप होता है, तो यह लूप शटडाउन संदेश की जांच कर सकता है। यदि यह i/o पर अवरुद्ध है, तो मुझे नहीं पता कि यह जागना संभव है या नहीं। मुझे इसके बारे में अधिक जानने में दिलचस्पी होगी। – derekdreery

उत्तर

1
  1. mozila के अनुसार, एक काम की मौत हो गई अब के लिए कोई और अधिक संभव है,, अकेले पढ़ा अवरुद्ध।
  2. mozilla/rust/pull/11410 के बाद ऐसा करना संभव होगा, जंग-zmq erickt/rust-zmq/issues/24 के लिए मेरी अन्य समस्या रिपोर्ट भी देखें जो इस पर निर्भर करता है। (लिंक के बारे में खेद है)
  3. शायद signal listener आपके लिए काम करेगा।
संबंधित मुद्दे