2011-11-15 20 views
6

तो मेरे पास एक दिलचस्प डिजाइन समस्या है। मैं एसएलएस 9 + लिनक्स, कर्नेल 2.6+ पर काम कर रहा हूं, और एक बहु थ्रेडेड एप्लिकेशन आरपीसी क्लाइंट के रूप में कार्य कर रहा हूं। विचार है कि अनुरोधों को संसाधित करने के लिए कुछ धागे रखें; ऐसा एक अनुरोध है कि एक बच्चे की प्रक्रिया के रूप में "नौकरी" शुरू करें।धागे, संकेत और बाल हैंडलिंग: क्या दुनिया ... क्या दुनिया

अब मेरी समस्या यह है कि विभिन्न सिग्नल से निपटने के लिए एक उचित सिग्नल हैंडलर स्थापित कर रहा है। मैंने जो किया है, वह अन्य धागे में सभी प्रासंगिक संकेतों को अवरुद्ध करते हुए sigwait() स्थिति पर बैठे सिग्नल हैंडलिंग के लिए एक और धागा स्थापित किया गया है। विचार यह है कि प्रक्रिया के लिए सभी सिग्नल सिग्नल हैंडलिंग थ्रेड को वितरित किए जाने चाहिए और शेष धागे केवल प्रोसेसिंग अनुरोधों के बारे में चिंता कर सकते हैं जैसे कि वे अंदर आते हैं।

यह सब उन सड़े हुए बच्चों को छोड़कर महान काम करता है, हमेशा अपने पिछवाड़े में अपने Frisbees फेंक और मेरे लॉन पर trampling ... लेकिन सभी गंभीरता में, मेरे सिग्नल हैंडलिंग थ्रेड SIGCHLD संकेत नहीं मिल रहा है। यहां क्या हो रहा है के बारे में मेरा सबसे अच्छा अनुमान यह है कि सिग्नल हैंडिंग थ्रेड वह धागा नहीं है जो बच्चे को जन्म देता है, यह सिगचल प्राप्त करने वाला धागा नहीं होगा, बल्कि इसके बजाय मेरे कार्यकर्ता धागे जो करेंगे।

तो मेरे सवालों के लिए के रूप में

:

  1. मैं के बारे में SIGCHLD मेरी संकेत हैंडलर धागा करने के लिए यह नहीं कर पागल हूँ?
  2. यदि मैं पागल नहीं हूं (यह एक खिंचाव है, मुझे पता है), आप इस छोटी सी समस्या को ठीक करने के बारे में कैसे जाएंगे? वर्तमान में मैं जो कर रहा हूं वह सिगचल्ड के लिए एक बहुत ही सरल सिग्नल हैंडलर सेट कर रहा है जो सभी धागे पर स्थापित होता है जो सिग्नल हैंडलिंग थ्रेड की अनुमति देने वाले सभी धागे में अवरुद्ध है जो प्रक्रिया समूह को सिगसआर 2 सिग्नल के रूप में सिग्नल भेजता है। यह काम करने के लिए लगता है, हालांकि मैं सोचने में मदद नहीं कर सकता कि मुझे कुछ याद आ रहा है या को संभालने का एक बेहतर तरीका है ... वह उसे प्राप्त करें, संभाल लें ... ठीक है मैं ' ll अब रोक

As per David Schwartz request SLES9: NPTL 2.3.5, SLES10: NPTL2.4

+0

मुझे अस्पष्ट क्यों है कि आप सिग्नल हैंडलिंग करने के लिए एक और धागा क्यों चाहते हैं। इसे ओएस द्वारा वैसे भी असीमित रूप से बुलाया जाएगा।यदि हैंडलर में काम करने का एक गुच्छा है, तो मैं एक सरल, त्वरित हैंडलर लिखूंगा जो एक सेमफोर फेंकता है और कार्यकर्ता धागे को बंद करता है। – EdH

+0

आप पागल नहीं हैं। सिग्नल को * किसी * थ्रेड द्वारा नियंत्रित किया जा सकता है जिसमें सिग्नल अवरुद्ध नहीं होता है। – nos

+4

"क्या दुनिया" वास्तव में समस्या का वर्णन नहीं करता है। –

उत्तर

2

(संपादित करें: क्योंकि मैंने पढ़ा है और नहीं कर सकते हैं आप पहले से ही कर रहे हैं उचित pthread_sigmask कॉल ....)

2,6 कर्नेल में, जब SIGCHLD उपेक्षा/गिरी SIG_IGN के लिए बच्चे की प्रक्रिया काटेंगे पर सेट है आप। ऐसा लगता है जैसे SIGCHLD को SIG_IGN/SIG_DFL पर सेट करने से बचने के लिए आपने सिग्नल हैंडलिंग थ्रेड के लिए SIGCHLD के लिए एक विशिष्ट हैंडलर सेट किया है।

संपादित करें (टिप्पणियों से): मुझे लगता है कि आपने किनारे का मामला मारा है। यदि आप बच्चों को फैलाने वाले थ्रेड में SIG_IGN के रूप में छोड़ देते हैं, तो कर्नेल सिगचल्ड भी नहीं भेजेगा। लेकिन अगर आप इसे संभालने के लिए सेट करते हैं, तो इसके बजाय आपके हैंडलर को बुलाया जाता है। मुझे लगता है कि अगर आप हैंडलर सेट करते हैं लेकिन फिर भी सिग्नल को pthread_sigmask में अवरुद्ध करते हैं, तो सिग्नल को उस थ्रेड पर डिलीवर किया जाएगा जिसमें सिग्नल अवरुद्ध नहीं होता है (आपका sigwait थ्रेड)।

+0

डिफ़ॉल्ट SIG_IGN पर सेट करना है, हालांकि मैंने sthchLD को sthmask में pthread_sigmask में पास करने का प्रयास किया और उस पर प्रतीक्षा करें। जिस समस्या को मैं देख रहा हूं वह यह है कि सिग्नल सिग्नल सिग्नल हैंडिंग थ्रेड पर नहीं भेजा जा रहा है, बल्कि इसके बजाय ** केवल ** धागे को भेजा गया है जो बच्चे को जन्म देता है। मेरे आस-पास के काम में अब यह है कि माता-पिता थ्रेड को प्रक्रिया समूह में एक SIGUSR2 जारी करना है, जब सिग्नल हैंडलर को बच्चे के रूप में प्राप्त होता है और इसका अर्थ होता है, तो – Bob9630

+0

के अनुसार कार्य करता है और मुझे लगता है कि आपने किनारे का मामला मारा है। यदि आप बच्चों को फैलाने वाले थ्रेड में SIG_IGN के रूप में छोड़ देते हैं, तो कर्नेल सिगचल्ड भी नहीं भेजेगा। लेकिन अगर आप इसे संभालने के लिए सेट करते हैं, तो इसके बजाय आपके हैंडलर को बुलाया जाता है। मुझे आश्चर्य है कि क्या आप हैंडलर सेट करते हैं लेकिन फिर भी सिग्नल को pthread_sigmask में अवरुद्ध करते हैं, क्या यह काम करेगा? – SoapBox

+0

विचित्र रूप से पर्याप्त है ... मुझे लगता है कि एक सिग्नल हैंडलर को मजबूर कर रहा है (मेरे मामले में मैं बस एक स्टब का उपयोग करता हूं) हम सिग्नल को "अनजान" करते हैं, हालांकि सिग्नल मास्क के कारण सिग्चल्ड अभी भी सभी धागे में अवरुद्ध है, यह हवाओं सिग्नल हैंडलर को डिलीवर किया जा रहा है जो वर्तमान में 'सिग्वाइट()' में है, इसलिए यह संकेत मिलता है जैसे मैं चाहता था। मुझे एक पक्ष दें और उत्तर अनुभाग में आपके पास पहले से क्या जवाब है और मैं जवाब दूंगा और इसे उत्तर के रूप में स्वीकार करूंगा। धन्यवाद! – Bob9630

1

संकलित करें और के रूप में आप अपने कार्यक्रम बनाने के लिए उपयोग लगभग एक ही संकलन विकल्पों के साथ इस कोड को चलाएँ:

#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 
int main(void) 
{ 
    char buf[512]; 
    confstr(_CS_GNU_LIBPTHREAD_VERSION, buf, 500); 
    printf("%s\n", buf); 
} 

This announcement एसएलएस 9 के साथ एनपीटीएल जहाजों के बारे में स्पष्ट नहीं है और यदि ऐसा है, तो यह डिफ़ॉल्ट है। लेकिन मेरी शर्त यह है कि आप लिनक्स थ्रेड का उपयोग कर रहे हैं जिसमें किसी प्रक्रिया को सिग्नल को लक्षित करने की क्षमता नहीं है।

+0

उन्होंने लिनक्स 2.6 का जिक्र किया ...? – cnicutar

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