2011-09-01 9 views
9

यूनिक्स पर्यावरण डब्ल्यू रिचर्ड स्टीवंस द्वारा में उन्नत प्रोग्रामिंग राज्यों:इस setjmp/longjmp संदर्भ में एक स्वचालित चर क्या है?

"स्वचालित चर की स्थितियाँ क्या हैं और मुख्य कार्य में चर रजिस्टर?"

क्या होता है जब आप longjmp स्टैक के नीचे कहीं से मुख्य (या अन्य फ़ंक्शन) पर वापस जाते हैं।

यह कहना है:

"यह निर्भर करता है ज्यादातर इम्प्लेमेंटेशन वापस इन स्वत: चर रोल और रजिस्टर चर करने की कोशिश नहीं है, लेकिन वह सब मानकों कहना है कि उनके मूल्यों अनिश्चित हैं।। आप एक स्वत: चर है कि आप वापस लुढ़का नहीं चाहते है, तो यह volatile विशेषता के साथ परिभाषित करते हैं। चर कि घोषित किया गया है वैश्विक या स्थिर अकेला छोड़ दिया जाता है जब longjmp निष्पादित किया जाता है।

ऐसा लगता है कि वह कह रहा है कि सामान्य स्टैक-वेरिएबल्स के पास सेटजैम्प के समय उनके मूल्यों को वापस सेट नहीं किया जाएगा - लेकिन फिर बाकी का फ़ंक्शन longjmp के बाद अपने स्टैक वैरिएबल पर निर्भर नहीं हो सकता यह पागल लगता है, तो मुझे लगता है कि मैं गलत हूँ।

क्या कोई मेरे लिए "स्वचालित चर" परिभाषित कर सकता है और समझा सकता है कि विशेष रूप से उसके मूल मूल्य पर क्या सेट नहीं किया गया है और यह क्यों है?

+1

एक स्वचालित चर केवल 'ऑटो' स्टोरेज क्लास के साथ एक है, जो फंक्शन वैरिएबल पर डिफ़ॉल्ट है जिसमें कोई अन्य स्टोरेज क्लास घोषणा नहीं है। यह एक खोजशब्द है, आप जानते हैं। – tchrist

उत्तर

6

सभी यह कह रहा है कि

  1. आप एक स्वत: (समारोह स्थानीय गैर स्थिर) चर कि volatile घोषित नहीं किया गया है; और
  2. आप setjmp और longjmp

तो longjmp के बाद कि चर का मान अनिश्चित हो जाता है के बीच चर के मूल्य बदल जाते हैं।

मेरा मानना ​​है कि इसे रैम की बजाय सीपीयू रजिस्टरों में रहने वाले ऐसे चर की संभावना और longjmp में इस तरह के चर के मूल्यों को संरक्षित करने में संबंधित कठिनाई की संभावना है। आप longjmp का उपयोग, स्वत: चर से सावधान हैं

:

यहाँ gcc manual से एक उद्धरण है। आईएसओ सी का कहना है कि स्वत: वेरिएबल जिन्हें घोषित नहीं किया गया है volatile के बाद मानों को अपरिभाषित किया है। और यह सभी जीसीसी वादे करने का वादा करता है, क्योंकि पंजीकरण चर को सही ढंग से पुनर्स्थापित करना बहुत मुश्किल है, और जीसीसी की विशेषताओं के यह है कि यह के बिना रजिस्टरों में चर डाल सकता है।

यदि परिवर्तनीय मानों का संभावित नुकसान आपके उपयोग मामले में एक समस्या है, तो volatile के रूप में प्रासंगिक चर घोषित करें।

+3

बेशक, वह जीसीसी मैनुअल उद्धरण एक खराब स्पष्टीकरण है: वास्तव में यह नहीं है कि आईएसओ सी क्या कहता है। यह केवल इसे अपरिभाषित करता है अगर वे संशोधित हैं, और उन्हें क्या बहाल करना मुश्किल नहीं है (आखिरकार, आप केवल सभी रजिस्टरों को सहेज सकते हैं और पुनर्स्थापित कर सकते हैं) लेकिन _avoiding_ अवांछित बहाली। – Random832

+0

दरअसल, इस यूबी के लिए * कारण * यह है कि सभी रजिस्टर मूल्यों को सहेजना और उन्हें बहाल करना आसान है, लेकिन यह * * की प्रतिलिपि * की याद रखने के लिए कार्यान्वयन के लिए अव्यवहारिक है (स्मृति में से एक या एक कैश एक रजिस्टर में) 'longjmp' के समय सबसे अद्यतित था। –

+0

@ Random832: धन्यवाद - मैंने चीजों को और स्पष्ट करने के प्रयास में जवाब संपादित किया है। – NPE

0

स्वचालित चर नियमित कार्य-स्थानीय चर होते हैं - क्योंकि उन्हें ढेर पर आवंटित किया जाता है और आपको उनकी स्मृति के बारे में परवाह नहीं करना पड़ता है, उन्हें स्वचालित कहा जाता है।

अधिक गहराई से विवरण के लिए http://en.wikipedia.org/wiki/Automatic_variable देखें।

6

"स्वचालित चर" सामान्य (पुराने या रजिस्टर के साथ घोषित नहीं) स्थानीय चर के लिए पुरानी अवधि है, जो सी मानक में उपयोग की जाने वाली शब्दावली और auto कीवर्ड का मूल अर्थ है। अनुभाग देखें 6.2.4 और the standard

इस के लिए के रूप में की 6.7.1:

लेकिन फिर समारोह के बाकी अपने ढेर चर पर भरोसा नहीं कर सकता है के बाद longjmp इसे वापस करने के लिए जो पागल लगता है

विचार है कि आप उन्हें पहली जगह में संशोधित करने के लिए आप longjmp क्योंकि तो आप को पता नहीं कर सकते हैं क्या होने जा रहा है जा रहे हैं नहीं करना पड़ेगा है।

कारण कि longjmp जैसे प्रोसेसर रजिस्टर, जो स्वत: चर को मैप किया गया हो सकता है के रूप में राज्य को बहाल कर सकते हैं (कोई गारंटी नहीं है कि वे पर "ढेर" या स्मृति सब पर। और अगर में हो जाएगा वे स्मृति में मौजूद हैं, कुछ ऑपरेशन [जब तक यह अस्थिर घोषित नहीं किया जाता है] सीधे स्मृति तक पहुंच सकते हैं लेकिन एक प्रोसेसर रजिस्टर तक पहुंच सकते हैं, जिस पर मूल्य पहले ही लोड हो चुका है)

आपका प्रश्न अजीब तरह का है क्योंकि यह आपको दर्शाता है उन्हें पुनर्स्थापित करने के लिए चाहते हैं [यानी कार्यों को हस्तक्षेप करने में आपके संशोधन मिटा दिए जाएंगे] - आम तौर पर यह चेतावनी चेतावनी दे रही है कि उन्हें दुर्घटना द्वारा पुनर्स्थापित किया जा सकता है जब इसकी अपेक्षा नहीं की जाती है। "बहाल नहीं किया गया" का मतलब "अनुपयोगी" नहीं है [हालांकि मानक DOES उन्हें अनुपयोगी घोषित करता है क्योंकि यह एक कैश किए गए रजिस्टर को पुनर्स्थापित कर सकता है लेकिन स्मृति नहीं, इसलिए आपको असंगत परिणाम मिलेंगे], इसका मतलब है "बाद में एक फ़ंक्शन मान दिया गया है यह (क्योंकि आपने इसके लिए लिखा जाने वाला पता पारित किया है) "।

+0

यह अजीब बात है कि आज इतने सारे लोग अपने चर के लिए सी के चार बुनियादी [स्टोरेज क्लास कीवर्ड] (http://en.wikipedia.org/wiki/Static_variable) को भूल गए हैं: 'auto',' static', 'register' , और 'बाहरी' - हालांकि एक 'अस्थिर' चर है [कुछ अलग] (http://en.wikipedia.org/wiki/Volatile_variable), और सबसे अच्छा संदिग्ध। – tchrist

0

auto का अर्थ कुछ भी है जो फ़ंक्शन के लिए स्थानीय है और इसे विशेष रूप से static के रूप में परिभाषित नहीं किया गया है। यह ध्यान देने योग्य है कि मानक काफी व्यवहार वह राज्यों (§7.13.2/3) निर्दिष्ट करता है शायद लायक है:

सभी सुलभ वस्तुओं मान हो, और अमूर्त मशीन के अन्य सभी घटक, राज्य है के रूप में समय longjmp फ़ंक्शन को कॉल किया गया था, सिवाय इसके कि स्वचालित स्टोरेज अवधि की ऑब्जेक्ट्स जो संबंधित सेटजैम्प मैक्रो के आमंत्रण वाले फ़ंक्शन के लिए स्थानीय हैं, जिनमें अस्थिर-योग्य प्रकार नहीं है और setjmp आमंत्रण के बीच बदल दिया गया है और longjmp कॉल अनिश्चित हैं।

0

मैं "स्वचालित चर" को परिभाषित नहीं कर सकते हैं, लेकिन शायद यह है कि मदद कर सकते हैं समझने के लिए क्या होता है एक के दौरान setjump:

(से कुछ) CPU रजिस्टरों और एक फ़ाइल में बचा लिया।

और longjump दौरान:

CPU रजिस्टरों का मूल्य बचाया मूल्य पर रीसेट है।

कुछ और नहीं! (here एक उदाहरण है)

longjump दौरान

तो, आप बस वापस ढेर में उच्च आते हैं, अपने सभी चर स्मृति अछूता में सहेजा साथ, और कुछ (उनमें से सभी) रजिस्टरों की, विशेष रूप से stack pointer और instruction pointersetjmp के दौरान उनके मान पर रीसेट हो गया।

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