2015-09-17 4 views
7

मुझे पता है कि जब हम Ctrl + C दबाते हैं, तो एक SIGINT सिग्नल उठाया जाएगा और प्रक्रिया को समाप्त करने की डिफ़ॉल्ट कार्रवाई कर्नेल द्वारा की जाएगी। लेकिन इस समाप्ति के लिए कोड कहां से आ रहा है? क्या यह ईएलएफ बाइनरी में है या कर्नेल हमारे लिए यह करता है? मुझे लगता है कि यह कर्नेल में है और इसलिए हमें सिग्नल व्यवहार को ओवरराइड करने के लिए हमारे स्रोत कोड में कस्टम हैंडलर की आवश्यकता है।ईएलएफ बाइनरी में डिफ़ॉल्ट सिग्नल हैंडलर के लिए कोड कहां है?

किसी भी पॉइंटर्स की बहुत सराहना की जाएगी।

उत्तर

5

यह कुछ कर्नेल हमारे लिए कर रहा है। आप कर्नेल स्रोतों में signal.c फ़ाइल पढ़कर सभी जानकारी पा सकते हैं।

बिंदु है जहां गिरी एक पंजीकृत संकेत हैंडलर खोजने की कोशिश कर रहा है यहाँ शुरू होता है: http://lxr.free-electrons.com/source/kernel/signal.c#L2257

2257     ka = &sighand->action[signr-1]; 
2258 
2259     /* Trace actually delivered signals. */ 
2260     trace_signal_deliver(signr, &ksig->info, ka); 
2261 
2262     if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */ 
2263       continue; 
2264     if (ka->sa.sa_handler != SIG_DFL) { 
2265       /* Run the handler. */ 
2266       ksig->ka = *ka; 
2267 
2268       if (ka->sa.sa_flags & SA_ONESHOT) 
2269         ka->sa.sa_handler = SIG_DFL; 
2270 
2271       break; /* will return non-zero "signr" value */ 
2272     } 

तो, वहाँ एक संकेत हैंडलर अगर और अगर यह नहीं है "संकेत उपेक्षा" (SIG_IGN) और अगर यह होता है "डिफ़ॉल्ट" हैंडलर (SIG_DEF) नहीं, कर्नेल इसे चलाने के लिए बस चिह्नित करेगा (और यदि यह एक शॉट है तो यह हैंडलर को फिर से डिफ़ॉल्ट हैंडलर में ले जाएगा)।

हालांकि, कोई संकेत हैंडलर पंजीकृत है, या यदि अगर यह SIG_DEF, गिरी जांच करता है कि शायद यह प्रक्रिया को रोकने के लिए, और अंत में राज्यों कर्नेल निम्नलिखित की जरूरत है:

2330     /* 
2331     * Anything else is fatal, maybe with a core dump. 
2332     */ 

http://lxr.free-electrons.com/source/kernel/signal.c#L2330

+0

अधिक प्रश्न - 'अगर' मैं अपना खुद का कस्टम हैंडलर प्रदान करता हूं? कस्टम हैंडलर में कोड कौन निष्पादित करेगा? लॉजिक को ओएस द्वारा रिंग 0 या रिंग 3 में प्रक्रिया में निष्पादित किया जाएगा? – bawejakunal

+1

@ बावेजकुनाल: इसे अंगूठी में निष्पादित किया जाएगा 3. अन्यथा करना एक पूर्ण सुरक्षा जोखिम होगा। – 3442

2

लेट्स आप kill(theShell, SIGINT) कहते हैं। क्या होता है कुछ है की तरह ... (कर्नेल कोड दिखाई नहीं दे रहा है क्योंकि यह वास्तव में प्रासंगिक नहीं है)

  1. सी क्रम पुस्तकालय प्रणाली कॉल sys_kill() के सभी तर्कों ले जाएगा, और विधानसभा कोड है कि एक प्रदर्शन निष्पादित करने के लिए आगे बढ़ना कच्चे सिस्टम कॉल।
  2. गिरी तर्क प्राप्त करता है, अनुमतियाँ चेक, आदि, आदि ...
  3. प्रक्रिया इसी संकेत हैंडलर SIG_DEF करने के लिए सेट है, तो गिरी इसी डिफ़ॉल्ट कार्रवाई सीधे और रिटर्न करता है प्रदर्शन करती है। यदि प्रक्रिया में संबंधित सिग्नल हैंडलर SIG_IGN पर सेट है, तो सिग्नल को अनदेखा किया जाता है और सिस्टम कॉल रिटर्न होता है। अन्यथा, जारी रखें।
  4. प्रेषक जैसी कुछ जानकारी के साथ-साथ लक्ष्य प्रक्रिया के लिए सिग्नल कतार पर सिग्नल लगाया जाता है।
  5. सिग्नल प्राप्त करने के लिए लक्ष्य प्रक्रिया में एक धागा चयन करने योग्य है, और इसे मुखौटा नहीं किया गया है, थ्रेड का संदर्भ (सीपीयू रजिस्ट्रार, स्टैक पॉइंटर, आदि ...) सहेजा गया है और सिग्नल हैंडलर को बुलाया जाता है। अगर थ्रेड सिग्नल के आगमन के समय सिस्टम कॉल में था, तो सिस्टम कॉल -EINTR (सादगी उद्देश्यों के लिए) देता है और हैंडलर का आह्वान किया जाता है। एक बार हैंडलर लौटने के बाद, सिस्टम कॉल sys_sigreturn स्वचालित रूप से संकेत दिया जाता है, सिग्नल से पहले धागे के राज्य को बहाल करता है।
  6. इस बीच चरण 5 होता है, kill() आईएनजी प्रक्रिया की सिस्टम कॉल रिटर्न।
संबंधित मुद्दे