विभिन्न संकेतों को भेजने का क्या कारण है?


28

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

तो यहाँ मेरा सवाल है: प्रत्येक सिग्नल को भेजने का क्या कारण है? मुझे एहसास है कि आप मैन्युअल रूप से -sपैरामीटर के माध्यम से चलने वाली प्रक्रियाओं को सिग्नल भेज सकते हैं kill, लेकिन वे प्राकृतिक परिस्थितियां क्या हैं जिनके तहत ये सिग्नल भेजे जाते हैं? उदाहरण के लिए, कब SIGINTभेजा जाता है?

इसके अलावा, क्या कोई प्रतिबंध है जिस पर संकेतों को नियंत्रित किया जा सकता है? क्या SIGSEGVसंकेतों को भी संसाधित किया जा सकता है और आवेदन पर नियंत्रण वापस किया जा सकता है?


इसका एक उचित उत्तर महाकाव्य होने जा रहा है, और मूल रूप से इस मामले पर विकिपीडिया लेख में जानकारी को दोहराते हैं , इसलिए मैं बस वहां बात करूंगा।
शॉन जे। गोफ

@ शॉन: विकिपीडिया लेख में संकेतों की एक सूची है, लेकिन कौन संकेत भेजता है, इसकी कोई स्पष्ट प्रस्तुति नहीं है।
गिलेस एसओ- बुराई को रोकें '23

जवाबों:


41

कॉलिंग की प्रक्रियाओं के अलावा kill(2), कुछ संकेत कर्नेल द्वारा (या कभी-कभी प्रक्रिया द्वारा ही) विभिन्न परिस्थितियों में भेजे जाते हैं:

  • टर्मिनल चालक विभिन्न घटनाओं के लिए संकेत भेजते हैं:
    • मुख्य प्रेस सूचनाएँ: SIGINT(कृपया मुख्य लूप पर वापस जाएँ) Ctrl+ पर C, SIGQUIT(कृपया तुरंत बाहर निकलें) Ctrl+ पर \, SIGTSTP(कृपया सस्पेंड करें) Ctrl+ पर Zsttyकमांड के साथ चाबी बदली जा सकती है ।
    • SIGTTINऔर SIGTTOUभेजा जाता है जब एक पृष्ठभूमि प्रक्रिया अपने नियंत्रण टर्मिनल को पढ़ने या लिखने की कोशिश करती है।
    • SIGWINCH यह संकेत देने के लिए भेजा जाता है कि टर्मिनल विंडो का आकार बदल गया है।
    • SIGHUPको यह संकेत देने के लिए भेजा जाता है कि टर्मिनल गायब हो गया है (ऐतिहासिक रूप से क्योंकि आपका मॉडेम h अन- अप हो गया था , आजकल आमतौर पर क्योंकि आपने टर्मिनल एमुलेटर विंडो बंद कर दिया है)।
  • कुछ प्रोसेसर जाल एक संकेत उत्पन्न कर सकते हैं। विवरण वास्तुकला और प्रणाली पर निर्भर हैं; यहाँ विशिष्ट उदाहरण हैं:
    • SIGBUS एक अनछुई एक्सेस मेमोरी के लिए;
    • SIGSEGV एक अनमैप्ड पेज तक पहुंचने के लिए;
    • SIGILL एक अवैध निर्देश (खराब ओपकोड) के लिए;
    • SIGFPEखराब तर्कों (जैसे sqrt(-1)) के साथ एक फ्लोटिंग-पॉइंट इंस्ट्रक्शन के लिए ।
  • संकेत की एक संख्या लक्ष्य प्रक्रिया को सूचित करती है कि कुछ सिस्टम घटना घट गई है:
    • SIGALRMसूचित करता है कि प्रक्रिया द्वारा निर्धारित एक टाइमर समाप्त हो गया है। टाइमर के साथ सेट किया जा सकता है alarm, setitimerऔर अन्य।
    • SIGCHLD एक प्रक्रिया को सूचित करता है कि उसके एक बच्चे की मृत्यु हो गई है।
    • SIGPIPEजब रीडिंग एंड को बंद करने की प्रक्रिया एक पाइप से लिखने की कोशिश करती है, तो यह उत्पन्न होता है (विचार यह है कि यदि आप चलाते हैं foo | barऔर barबाहर निकल जाते हैं, तो)foo तो मारा जाता है SIGPIPE)।
    • SIGPOLL(यह भी कहा जाता है SIGIO) इस प्रक्रिया को सूचित करता है कि एक प्रदूषित घटना घट गई है। POSIX प्रदूषित घटनाओं के माध्यम से पंजीकृत निर्दिष्ट करता है I_SETSIG ioctl। कई सिस्टम O_ASYNC fcntlध्वज के माध्यम से सेट किसी भी फाइल डिस्क्रिप्टर पर प्रदूषित घटनाओं की अनुमति देते हैं । एक संबंधित संकेत है SIGURG, जो एक डिवाइस पर तत्काल डेटा को सूचित करता है (के माध्यम से पंजीकृत)I_SETSIG ioctl सॉकेट के ) या सॉकेट
    • कुछ प्रणालियों पर, SIGPWRसभी प्रक्रियाओं को भेजा जाता है जब यूपीएस संकेत देता है कि बिजली की विफलता आसन्न है।

ये सूचियाँ संपूर्ण नहीं हैं। मानक संकेतों में परिभाषित किया गया हैsignal.h

अधिकांश संकेतों को एप्लिकेशन द्वारा पकड़ा और संभाला (या अनदेखा) किया जा सकता है। केवल दो पोर्टेबल सिग्नल जिन्हें पकड़ा नहीं जा सकता है SIGKILL(बस मर जाते हैं) और STOP(निष्पादन रोकें)।

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

अंत में, मैं एक संकेत नहीं है कि कुछ का उल्लेख करते हैं। जब आप टर्मिनल से इनपुट पढ़ रहे प्रोग्राम में एक लाइन की शुरुआत में Ctrl+ दबाते हैं D, तो यह प्रोग्राम को बताता है कि इनपुट फ़ाइल का अंत पहुँच गया है। यह एक संकेत नहीं है: यह इनपुट / आउटपुट एपीआई के माध्यम से प्रेषित होता है। जैसा Ctrl+ Cऔर दोस्तों, कुंजी के साथ विन्यस्त किया जा सकता stty


और SIGHUP, आपका मॉडेम लटका हुआ है। :-)
कीथ

1
एक और बात ध्यान देने योग्य है: SIGFPEकुछ हद तक अनजाने में, पूर्णांक विभाजित-शून्य पर और कभी-कभी हस्ताक्षर किए गए पूर्णांक ओवरफ़्लो पर भी संकेत दिया जाता है ।

18

पहले अपने दूसरे प्रश्न का उत्तर देने के लिए: SIGSTOPऔर SIGKILLआवेदन द्वारा पकड़ा नहीं जा सकता है, लेकिन हर दूसरे संकेत, यहां तक ​​कि कर सकते हैंSIGSEGV । यह संपत्ति डिबगिंग के लिए उपयोगी है - उदाहरण के लिए, सही पुस्तकालय समर्थन के साथ, आप सुन सकते हैं SIGSEGVऔर एक स्टैक बैकट्रेस उत्पन्न करने के लिए दिखा सकते हैं कि जहां सेगफॉल्ट हुआ था।

man 7 signalलिनक्स कमांड लाइन से टाइप करके प्रत्येक सिग्नल जो करता है, उस पर आधिकारिक शब्द (लिनक्स के लिए, वैसे भी) उपलब्ध है । http://linux.die.net/man/7/signal में समान जानकारी है, लेकिन तालिकाएं पढ़ना कठिन है।

हालांकि, संकेतों के साथ कुछ अनुभव के बिना, छोटे विवरणों से जानना मुश्किल है कि वे अभ्यास में क्या करते हैं, इसलिए यहां मेरी व्याख्या है:

कीबोर्ड से ट्रिगर किया गया

  • SIGINT जब आप हिट करते हैं तब होता है CTRL+C
  • SIGQUIT द्वारा ट्रिगर किया गया है CTRL+\ , और कोर को डंप करता है।
  • SIGTSTPजब आप हिट करते हैं तो आपके कार्यक्रम को निलंबित कर देता है CTRL+Z। इसके विपरीत SIGSTOP, यह उपलब्ध है, जो कार्यक्रमों को पसंद करता हैvi खुद को निलंबित करने से पहले टर्मिनल को सुरक्षित राज्य में रीसेट करने का मौका ।

टर्मिनल बातचीत

  • SIGHUP ("हैंगअप") तब होता है जब आप अपना xterm बंद करते हैं (या अन्यथा टर्मिनल को डिस्कनेक्ट करते हैं) जब आपका प्रोग्राम चल रहा होता है।
  • SIGTTINऔर SIGTTOUअगर यह पृष्ठभूमि में चल रहा है तो टर्मिनल से पढ़ने या लिखने की कोशिश करता है, तो अपने कार्यक्रम को रोकें। के लिए SIGTTOUहोने, मुझे लगता है कि कार्यक्रम आवश्यकताओं के लिखने के /dev/ttyही नहीं, डिफ़ॉल्ट stdout।

सीपीयू अपवाद द्वारा ट्रिगर किया गया

इनका मतलब है कि आपके कार्यक्रम ने कुछ गलत करने की कोशिश की।

  • SIGILLएक अवैध या अज्ञात प्रोसेसर निर्देश का मतलब है। यदि आप प्रोसेसर I / O पोर्ट को सीधे एक्सेस करने की कोशिश करते हैं, तो यह हो सकता है।
  • SIGFPEएक हार्डवेयर गणित त्रुटि थी; सबसे अधिक संभावना है कि कार्यक्रम शून्य से विभाजित करने की कोशिश की।
  • SIGSEGV इसका मतलब है कि आपके कार्यक्रम ने स्मृति के अनपेड क्षेत्र तक पहुँचने का प्रयास किया है।
  • SIGBUSइसका मतलब है कि प्रोग्राम ने मेमोरी को किसी अन्य तरीके से गलत तरीके से एक्सेस किया है; मैं इस सारांश के विवरण में नहीं जाऊंगा।

प्रक्रिया बातचीत

  • SIGPIPEयदि आप पाइप के पाठक के अंत को बंद करने के बाद पाइप पर लिखने की कोशिश करते हैं तो ऐसा होता है। देख लो man 7 pipe
  • SIGCHLDतब होता है जब आपके द्वारा बनाई गई एक बच्चे की प्रक्रिया या तो समाप्त हो जाती है या उसे निलंबित कर दिया जाता है ( SIGSTOPया इसी तरह)।

आत्म-संकेत के लिए उपयोगी

  • SIGABRTआमतौर पर प्रोग्राम को कॉल करने के कारण होता है abort(), और डिफ़ॉल्ट रूप से एक कोर डंप का कारण बनता है। एक "पैनिक बटन" की तरह।
  • SIGALRMalarm()सिस्टम कॉल के कारण होता है , जो कर्नेल को SIGALRMनिर्दिष्ट संख्या में सेकंड के बाद प्रोग्राम में वितरित करने का कारण होगा । देखें man 2 alarmऔर man 2 sleep
  • SIGUSR1और SIGUSR2उपयोग किया जाता है, हालांकि कार्यक्रम पसंद करता है। वे प्रक्रियाओं के बीच संकेतन के लिए उपयोगी हो सकते हैं।

व्यवस्थापक द्वारा भेजा गया

इन संकेतों को आम तौर पर, कमांड प्रॉम्प्ट से भेजे जाते हैं के माध्यम से killआदेश, या fgया bgके मामले में SIGCONT

  • SIGKILLऔर SIGSTOPअनब्लॉक सिग्नल हैं। पहले हमेशा प्रक्रिया को तुरंत समाप्त करता है; दूसरी प्रक्रिया को निलंबित कर देता है।
  • SIGCONT एक निलंबित प्रक्रिया शुरू करता है।
  • SIGTERMका एक बिल्ली के समान संस्करण है SIGKILL

shutdownकमांड का उपयोग करने पर कौन सा सिग्नल भेजा जाता है?
नाथन उस्मान

यह शटडाउन स्क्रिप्ट पर निर्भर करता है। आमतौर पर, SIGTERMपहले भेजा जाता है, उसके बाद देरी होती है, उसके बाद SIGKILL। सिद्धांत रूप में, एक कठिन, तत्काल शटडाउन के लिए, कर्नेल को एक संकेत भेजने की आवश्यकता नहीं है; यह प्रक्रिया को चलाने से रोक सकता है।
जेंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.