2011-08-08 16 views
5

कोई विचार क्यों सिग्नल हैंडलर अनंत लूप पर जाता है?सिग्नल हैंडलर अनंत लूप क्यों जाता है? - SIGSEGV

यहां कोड है। कृपया मेरी मदद करें।

enter code here 
9 void SIGSEGV_handler(int signal) 
10 { 
11 printf("Segmentation fault caught....\n"); 
12 printf("Value of instance variable: i = %d\n\n", i); 
13 } 
16 
17 int main() 
18 { 
19 char *mallocPtr, *callocPtr, *reallocPtr, *memalignPtr, *vallocPtr; 
20 struct sigaction sa; 
21 
22 sa.sa_handler=SIGSEGV_handler; 
23 sigaction(SIGSEGV, &sa, NULL); 
24 
37 
38 printf("The segmentation fault handler will be entered for i = 3, 4, 5 and 6\n"); 
39 
40 
41 for(i=0; i<7; i++) 
42 { 
43 printf("i = %d\n",i); 
44 
45 mallocPtr=(char*)malloc(3); 
46 printf("Malloc address : %x\n",mallocPtr); 
47 strcpy(mallocPtr, "Hhvhgvghsvxhvshxv"); 
48 puts(mallocPtr); 
+0

क्या यह सिर्फ मुझे है, या आपने पूरे 'लूप' को पोस्ट नहीं किया है? हो सकता है कि आप जिस लाइन को 'i'' कर रहे हों, और मुझे विश्वास है कि आपने इसे वैश्विक रूप से घोषित किया है और यह अकेले – Djole

+0

करने के लिए एक बुरी चीज है, आप सिग्नल हैंडलर में विश्वसनीय रूप से प्रिंटफ का आह्वान नहीं कर सकते हैं। आप SIGSEGV के लिए एक हैंडलर से विश्वसनीय रूप से वापस नहीं आ सकते (आपको इसके बजाय बाहर निकलना चाहिए)। –

+0

नहीं, मैं बाहर नहीं जा सकता .. क्योंकि मेरे मामले में मुझे हैंडलर पर जा रहे अंतराल को पकड़ने की आवश्यकता है (3 से 6 सेकेंड हो सकता है)। – kingsmasher1

उत्तर

14

SIGSEGV की डिफ़ॉल्ट गतिविधि आपके प्रक्रिया समाप्त करने के लिए है। लेकिन अगर आप एक हैंडलर स्थापित करने और इसे ओवरराइड: हर अनुदेश कि एक SIGSEGV से चलाता है के लिए तो

/* Does nothing to "fix" what was wrong with the faulting 
* instruction. 
*/ 
void SIGSEGV_handler(int signal) 
{ 
    printf("Segmentation fault caught....\n"); 
    printf("Value of instance variable: i = %d\n\n", i); 
} 

, इस हैंडलर कहा जाता है और शिक्षा को पुन: प्रारंभ किया गया है। लेकिन आपके हैंडलर ने दोषपूर्ण निर्देश के साथ पहली जगह में गलत क्या तय करने के लिए कुछ भी नहीं किया।

निष्कर्ष में, जब निर्देश पुनरारंभ होता है, तो यह फिर से गलती होगी। और फिर, और फिर और ... आपको विचार मिलता है।

+0

लेकिन मुझे उम्मीद है: दोषपूर्ण निर्देश पर, हैंडलर को बुलाया जाएगा, और बदले में इसे कोड की अगली पंक्ति में जाना चाहिए, है ना? (अगली पंक्ति मेरा मतलब है, दोषपूर्ण निर्देश के बाद लाइन) – kingsmasher1

+0

@ kingsmasher1 नहीं। यह अगली पंक्ति में नहीं जाती है। यह फिर से वर्तमान निर्देश निष्पादित करने का प्रयास करता है। – cnicutar

+3

@ राजाmasher1: ऑब्जेक्ट कोड में, "अगली पंक्ति" की कोई धारणा नहीं है। यह सिर्फ प्रोसेसर निर्देश है। –

6

http://pubs.opengroup.org/onlinepubs/009604599/functions/xsh_chap02_04.html#tag_02_04

एक प्रक्रिया के व्यवहार अपरिभाषित हो जाने के बाद यह एक SIGBUS, SIGFPE, SIGILL, या SIGSEGV संकेत है कि मार(), sigqueue (द्वारा उत्पन्न नहीं किया गया था के लिए एक संकेत को पकड़ने समारोह से सामान्य रूप से रिटर्न), या उठाओ()।

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