2011-06-03 6 views
12

बहु लड़ी पिरोया में अतुल्यकालिक सिग्नल से निपटने लिनक्स प्रोग्रामिंग इंटरफ़ेस बुक एक बहु लड़ी कार्यक्रम में अतुल्यकालिक संकेतों के साथ निपटने के लिए एक विधि का उल्लेख किया गया है:कार्यक्रम

  • सभी थ्रेड अतुल्यकालिक संकेतों के सभी ब्लॉक कि इस प्रक्रिया प्राप्त हो सकता है। करने का सबसे आसान तरीका यह किसी अन्य थ्रेड बनाए जाने से पहले मुख्य थ्रेड में संकेतों को अवरुद्ध करना है। प्रत्येक बाद निर्मित थ्रेड मुख्य धागे के सिग्नल मास्क की एक प्रति प्राप्त करेगा।
  • एक समर्पित समर्पित थ्रेड बनाएं जो sigwaitinfo(), sigtimedwait() या sigwait() का उपयोग कर आने वाले संकेतों को स्वीकार करता है।

इस दृष्टिकोण का लाभ यह है कि एसिंक्रोनस रूप से उत्पन्न संकेतों तुल्यकालिक प्राप्त हो रहा है। यह भेजे संकेतों, समर्पित धागा सुरक्षित रूप से साझा चर (म्युटेक्स नियंत्रण में) को संशोधित करने और गैर async-सुरक्षित कार्यों कॉल कर सकते हैं स्वीकार करता है के रूप में। यह सिग्नल स्थिति चर, और अन्य थ्रेड और प्रक्रिया संचार और सिंक्रनाइज़ेशन तंत्र को भी लागू कर सकता है।

अब सवाल:

  1. जब गिरी संकेत यह प्रक्रिया मनमाने ढंग से अंदर धागे से एक का चयन वितरित करने के लिए चाहता है। जहां से समर्पित धागे को संकेत देने के लिए यह पता चल सकता है?
  2. pthread API गैर-एंक-सुरक्षित फ़ंक्शन है। तो हम सिग्नल हैंडलर के अंदर उनका उपयोग कैसे कर सकते हैं?

उत्तर

8

जब गिरी एक प्रक्रिया निर्देशित संकेत भेजता है, यह सूत्र कि संकेत नहीं है में से एक अवरुद्ध चुनता है। इसका मतलब यह है कि यह कभी नहीं संकेत से निपटने धागा (जो कार्य करता है यह संकेत अवरोध हटा, जबकि यह sigwaitinfo() या इसी तरह में अवरुद्ध है है की तरह) से अलग धागे के किसी भी चुनता है।दूसरे शब्दों में: कर्नेल जानता है कि सिग्नल वितरित करना है, क्योंकि आपने चीजों को व्यवस्थित किया है जैसे सिग्नल-हैंडलिंग थ्रेड एकमात्र थ्रेड है जिसे कभी सिग्नल देने की अनुमति दी जाती है।

आप सिग्नल हैंडलर में pthreads API या किसी भी गैर-एसिंक-सिग्नल-सुरक्षित फ़ंक्शंस का उपयोग करते हैं। उल्लिखित समाधान सिग्नल हैंडलर के सिग्नल को संभाल नहीं करता है - यह sigwaitinfo() रिटर्न के बाद सिग्नल-हैंडलिंग थ्रेड के सामान्य निष्पादन प्रवाह के भीतर संकेतों को संभालता है। यह गैर-एसिंक-सिग्नल-सुरक्षित फ़ंक्शंस तक पहुंचने की अनुमति देता है, जो संपूर्ण बिंदु है।

3

याद रखें कि प्रस्ताव किसी भी धागे को प्राप्त करने या किसी भी सिग्नल प्राप्त करने से पहले, प्रक्रिया के निष्पादन के आरंभ में सिग्नल (pthread_sigmask() का उपयोग करके) को अवरुद्ध करना है।

आपके सवालों के जवाब के लिए:

  1. sigwait() (और/या sigwaitinfo()) के लिए आदमी पृष्ठ पढ़ें। जब कर्नेल आपकी प्रक्रिया को सिग्नल भेजना चाहता है लेकिन सभी धागे में सिग्नल अवरुद्ध हो जाता है, तो सिग्नल "कतारबद्ध" हो जाता है। यह तब तक कतारबद्ध रहता है जब तक कि (ए) कुछ थ्रेड सिग्नल को अनब्लॉक नहीं करते हैं; या (बी) सिग्नल पर कुछ धागे sigwait() या sigwaitinfo() कहते हैं। प्रस्ताव यहां बाद में करने के लिए एक धागा समर्पित करना है।

  2. विचार है कि आप कभी नहीं किसी भी संकेत हैंडलर चलाते हैं, क्योंकि कोई धागा कभी संकेत को खोलता है। इसके बजाए, एक थ्रेड सिग्वाइट() के साथ सिग्नल के लिए इंतजार कर रहा है, और फिर यह सिग्नल को संसाधित करता है। यह सब संकेत से निपटने संदर्भ है, जो प्रस्ताव का सौंदर्य है की बाहर होता है।

+0

संकेतों को अवरुद्ध करने के लिए सिग्नेक्शन का उपयोग नहीं किया जाता है, सिगप्रोकमास्क और pthread_sigmask देखें। –

+0

@ToddFreed: मानो या नहीं, वास्तव में मेरा मतलब था ... निश्चित; धन्यवाद – Nemo

0

आप किसी अन्य तंत्र का उपयोग कर सिग्नल हैंडलर से अप्रत्यक्ष रूप से pthread API को कॉल कर सकते हैं। मुख्य धागे में, एक यूनिक्स डोमेन सॉकेट बनाएं जो कुछ आदेशों को सुनता है। सिग्नल हैंडलर में सॉकेट से कनेक्ट करने के लिए कोड हो सकता है और मुख्य थ्रेड पर आदेश भेज सकता है ताकि आप जिस पीढ़ी एपीआई को कॉल करना चाहते हैं उसे कॉल कर सकें।