सिग्नल मिलने पर मल्टीथ्रेडेड लिनक्स प्रक्रिया का क्या होता है?


20

यदि एक यूनिक्स (पॉज़िक्स) प्रक्रिया एक संकेत प्राप्त करती है, तो एक सिग्नल हैंडलर चलेगा।

एक बहुआयामी प्रक्रिया में इसका क्या होगा? कौन सा धागा संकेत प्राप्त करता है?

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

वर्तमान स्थिति क्या है?


3
का डुप्लीकेट stackoverflow.com/questions/11679568/... "pthreads (7) का वर्णन करता है कि POSIX.1 एक प्रक्रिया शेयर विशेषताओं के सारे सूत्र, संकेत स्वभाव सहित आवश्यकता है"
स्टीव

@ जल्दबाजी धन्यवाद, लेकिन 1) यह एक और एसई साइट 2 पर है) यह कल्पना स्पष्ट रूप से निर्दिष्ट नहीं करती है कि वास्तव में क्या होगा। इसका क्या मतलब है, सिग्नल हैंडलर सभी थ्रेड्स पर कॉल किए जाएंगे , लेकिन यह मुझे थोड़ा सा लगता है। 3) यह उत्तर निर्दिष्ट नहीं करता है कि लिनुस का मॉडल क्या था और वर्तमान में इसका उपयोग क्यों / कैसे किया जाता है।
पीटर - मोनिका

जवाबों:


9

" सिग्नल जनरेशन एंड डिलीवरी " पर "Rationale: System Interfaces General Information" में POSIX में प्रविष्टि कहती है

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

signal(7)लिनक्स सिस्टम पर मैनुअल से :

किसी प्रक्रिया के लिए एक संकेत (या इस तरह लंबित) उत्पन्न हो सकता है (जैसे, जब उपयोग किया जाता है kill(2)) या किसी विशिष्ट थ्रेड के लिए (जैसे, कुछ संकेत, जैसे कि SIGSEGV और SIGFPE, एक विशिष्ट मशीन को निष्पादित करने के परिणामस्वरूप उत्पन्न होते हैं- भाषा निर्देश थ्रेड निर्देशित हैं, जैसा कि एक विशिष्ट थ्रेड पर लक्षित संकेतों का उपयोग करके किया जाता है pthread_kill(3))। एक प्रक्रिया-निर्देशित संकेत उन थ्रेड्स में से किसी एक को दिया जा सकता है, जिसमें वर्तमान में संकेत अवरुद्ध नहीं है। यदि थ्रेड्स में से एक में सिग्नल अनब्लॉक है, तो कर्नेल एक मनमाना धागा चुनता है जिससे सिग्नल डिलीवर किया जा सके।

और में pthreads(7):

थ्रेड्स में अलग-अलग वैकल्पिक सिग्नल स्टैक सेटिंग्स हैं। हालाँकि, एक नए थ्रेड के वैकल्पिक सिग्नल स्टैक सेटिंग्स को उस थ्रेड से कॉपी किया जाता है जिसने इसे बनाया है, ताकि थ्रेड्स शुरू में एक वैकल्पिक सिग्नल स्टैक (कर्नेल 2.6.16 में तय) को साझा करें।

pthreads(3)OpenBSD सिस्टम पर मैनुअल से (एक वैकल्पिक दृष्टिकोण के उदाहरण के रूप में):

सिग्नल हैंडलर सामान्य रूप से वर्तमान में निष्पादित धागे के ढेर पर चलाए जाते हैं।

(मुझे इस बात की जानकारी नहीं है कि मल्टी-प्रोसेसर मशीन पर कई थ्रेड समवर्ती निष्पादित होने पर इसे कैसे संभाला जाता है)

POSIX थ्रेड्स के पुराने LinuxThread कार्यान्वयन ने केवल संकेतों के आधार पर अलग-अलग एकल थ्रेड्स को लक्षित करने की अनुमति दी। से pthreads(7)एक Linux सिस्टम पर:

LinuxThreads प्रक्रिया-निर्देशित संकेतों की धारणा का समर्थन नहीं करता है: संकेत केवल विशिष्ट थ्रेड्स को भेजे जा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.