2010-07-28 10 views
26

क्या होता है यदि मैं चल रहा हो तो निष्पादन योग्य पुन: संकलित करता हूं? क्या ऑपरेटिंग सिस्टम सभी निष्पादन योग्य सामग्री को मेमोरी में पढ़ते समय पढ़ता है, इसलिए यह नई निष्पादन योग्य फ़ाइल को कभी नहीं पढ़ेगा? या क्या यह नई निष्पादन योग्य फ़ाइल के अनुभागों को पढ़ेगा जो सोचते हैं कि यह नहीं बदला है, जिससे संभवतः अपरिभाषित व्यवहार हो सकता है?क्या यह चल रहा है जब एक निष्पादन योग्य recompile सुरक्षित है?

क्या होगा यदि मेरे पास एक स्क्रिप्ट चल रही है जो एक लूप में बार-बार निष्पादन योग्य को आमंत्रित करती है, और स्क्रिप्ट चल रहा है, तो मैं निष्पादन योग्य पुन: संकलित करता हूं। क्या यह गारंटी है कि लूप के भविष्य के पुनरावृत्तियों ने नए निष्पादन योग्य का आह्वान किया होगा, और केवल उस आमंत्रण का नतीजा जो स्विच किया गया था जब प्रगति पर था, दूषित हो सकता है?

मेरा ओएस लिनक्स है, लेकिन मैं विंडोज़ पर क्या होता है इसके बारे में भी उत्सुक हूं।

+1

कौन सी भाषा और कार्यान्वयन? अधिकांश सामान्य लिस्प कंपाइलरों के लिए, फ्लाई पर निष्पादन योग्य बदलने में कोई समस्या नहीं है। अन्य सिस्टम अलग-अलग काम करते हैं। –

+0

यह एक सी ++ निष्पादन योग्य है। मुझे यकीन नहीं है कि यह ऑपरेटिंग सिस्टम में कैसे फर्क पड़ता है, हालांकि ... – HighCommander4

+1

यह संकलन और निष्पादन में एक अंतर बनाता है पूरी तरह से अलग कदम हैं, और इसलिए यह बात है कि ओएस निष्पादन योग्य फ़ाइलों को कैसे प्रबंधित करता है। –

उत्तर

28

चूंकि यह एक पारंपरिक संकलक है, जो एक निष्पादन योग्य फ़ाइल लिखता है, चलो लिनक्स में इसका पालन करें।

पहली बात यह जानना है कि एक लिनक्स फ़ाइल नाम सीधे फ़ाइल को संदर्भित नहीं करता है, बल्कि एक निर्देशिका प्रविष्टि के लिए, जो फ़ाइल नाम से स्वतंत्र है। एक फ़ाइल में वास्तव में फ़ाइल नाम होने की आवश्यकता नहीं होती है, लेकिन अगर इसे संदर्भित करना मुश्किल नहीं होता है।

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

इसलिए, यदि आप एक ही नाम के नए निष्पादन योग्य पुन: संकलित और निर्माण करते हैं, तो आप चल रहे प्रक्रिया को प्रभावित नहीं करेंगे। यह पुराने निष्पादन योग्य का उपयोग जारी रखेगा। फ़ाइल खोलने का प्रयास करने वाली कोई भी नई प्रक्रिया नया प्राप्त करेगी। यदि आपको लूप में system("foo"); मिल गया है, तो प्रत्येक बार जब इसे निष्पादित किया जाता है तो यह देखेगा कि फ़ाइल नाम फ़ू का अर्थ क्या है।

विंडोज़ फाइलों को अलग-अलग संभालती है। सामान्यतः, यदि फ़ाइल का उपयोग कर कोई प्रक्रिया है, तो फ़ाइल लॉक हो गई है और इसे हटाया या बदला नहीं जा सकता है।

+0

दिलचस्प - यह मुझे लिनक्स फ़ाइलों को कैसे संभालता है में कुछ अच्छी अंतर्दृष्टि देता है। – HighCommander4

+1

[लिनक्स] यह इस बात पर निर्भर करता है कि आप फाइल को "प्रतिस्थापित" कैसे करते हैं, यह काम करेगा या नहीं। आप लिखने के लिए एक उपयोग में निष्पादन योग्य नहीं खोल सकते हैं। – camh

+0

क्या होगा, .exe फ़ाइल के लिंकर के आउटपुट के माध्यम से आधा रास्ते, मैं इसे चलाने का प्रयास करता हूं? क्या यह आधा लिखित निष्पादन योग्य शुरू करने का प्रयास करेगा? – Thanatos

7

यह निर्भर करता है।

यदि ओएस पूरी तरह से निष्पादन योग्य स्मृति में पढ़ता है और डिस्क छवि पर वापस संदर्भित नहीं करता है तो हाँ आप "उपयोग में" होने पर इसे पुन: संकलित कर सकते हैं।

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

लिनक्स/यूनिक्स के साथ "उपयोग में" फ़ाइल को ओवरराइट करना संभव है। एक विस्तृत स्पष्टीकरण के लिए डेविड थॉर्नली का जवाब देखें।

0

मुझे लगता है कि यह आपको फ़ाइल को प्रतिस्थापित नहीं करने देगा, क्योंकि विंडोज़ इसे उपयोग में बंद कर देता था।

0

यह निर्भर करता है। मैंने जो अनुभव किया है, उससे लिनक्स पर आप अभी भी प्रोग्राम चला रहे हैं यदि आप इसे हटाते हैं (और यह बहुत बड़ा नहीं है)। लेकिन मुझे नहीं लगता कि यह परिभाषित व्यवहार है।

जहां तक ​​लूप चला जाता है, इस पर निर्भर करता है कि आप निष्पादन योग्य तरीके से कैसे आक्रमण कर रहे हैं, आप संभवत: आधे रास्ते में लिखे गए प्रोग्राम को निष्पादित करने के लिए अपनी स्क्रिप्ट को क्रैश कर देंगे।

0

विंडोज़ में आप निष्पादन योग्य अभी भी चल रहे हैं, तो फ़ाइल लॉक हो जाएगी। यदि एक्सई वास्तव में नहीं चल रहा है, तो नए स्क्रिप्ट को नए चीजों को चुनना चाहिए, इस पर निर्भर करता है कि आपकी स्क्रिप्ट को अन्य चीजों के साथ कैसे कोड किया गया है।

मुझे लिनक्स के बारे में पता नहीं है।

-1

निष्पादन योग्य स्टार्टअप पर पूरी तरह से स्मृति में लोड हो सकता है, हालांकि यदि यह काफी बड़ा है, और काफी देर तक चल रहा है, तो ओएस इसके कुछ अप्रयुक्त हिस्सों को स्वैप करने का निर्णय ले सकता है।

चूंकि ओएस मानता है कि प्रोग्राम की फ़ाइल अभी भी है, वास्तव में इन मेमोरी ब्लॉक को स्वैप फ़ाइल में लिखने का कोई कारण नहीं है। तो वे बस अवैध और पुन: उपयोग कर रहे हैं। यदि प्रोग्राम को इन पृष्ठों को फिर से चाहिए, तो ओएस उन्हें निष्पादन योग्य फ़ाइल से लोड करता है।

विंडोज में यह वास्तव में स्वचालित रूप से होता है, क्योंकि एक लोड मॉड्यूल एक मेमोरी मैप की गई फ़ाइल है। इसका अर्थ यह भी है कि फ़ाइल को इसके निष्पादन के दौरान बंद कर दिया गया है, और आप इसे आसानी से ओवरराइट करने में सक्षम नहीं होंगे।

लिनक्स के बारे में निश्चित नहीं है, लेकिन आईआईआरसी यह वही तरीके से स्वैपिंग करता है।

5

विंडोज़ में आप लॉक की गई फ़ाइल को हटा नहीं सकते हैं, लेकिन अधिकांश लोगों को यह नहीं पता कि आप चल रहे एक्सई को स्थानांतरित या नाम बदल सकते हैं।

तो तुम सकता है

  • कदम एक ही ड्राइव
  • अगले रिबूट पर हटाने के लिए यह समय पर एक अस्थायी निर्देशिका के लिए पुराने exe: MoveFileEx (नाम, शून्य, MOVEFILE_DELAY_UNTIL_REBOOT);
  • अपनी जगह में एक नया एक्सई ले जाएं।

पुराना प्रोग्राम चल रहा रहेगा लेकिन नई प्रक्रियाएं नई फ़ाइल का उपयोग करेंगी।

+3

दिलचस्प जानकारी जिसका उपयोग यह प्रदर्शित करने के लिए किया जा सकता है कि खराब डिज़ाइन विकल्प अजीब कामकाज का कारण बन सकते हैं। फ़ाइल, फ़ाइल नाम और इनोड के बारे में जानकारी को विभाजित करके ऐसे जटिल आदेशों की कोई आवश्यकता नहीं है। इसके अलावा, रीबूट की कोई आवश्यकता नहीं है। फ्लाई पर अपग्रेड हो सकता है। – Saurabh

4

लिनक्स के तहत, निष्पादन योग्य मांग की आवश्यकता के रूप में स्मृति में मांग की जाती है। डिस्क पर निष्पादन योग्य एप्लिकेशन के लिए बैकिंग स्टोर बन जाता है। इसका मतलब है कि आप डिस्क पर निष्पादन योग्य संशोधित नहीं कर सकते हैं या आप एक चल रहे एप्लिकेशन को प्रभावित करेंगे। यदि आप open(2) लिखने के लिए उपयोग में आने योग्य उपयोग करने का प्रयास करते हैं, तो आपको ETXTBSY (टेक्स्ट फ़ाइल व्यस्त) त्रुटि मिलेगी (open(2) के लिए मैन पेज देखें)।

जैसा कि कई अन्य ने कहा है, आप फ़ाइल सिस्टम (unlink(2)) से फ़ाइल को हटा सकते हैं और कर्नेल इसके संदर्भ को बनाए रखेगा और डिस्क से इसे तब तक नहीं हटाएगा जब तक कि कोई और संदर्भ न हो (जब प्रक्रिया समाप्त हो जाए, तो यह होगा फ़ाइल के संदर्भ में रिलीज करें)। इसका अर्थ यह है कि आप पहले इसे हटाकर एक उपयोग में निष्पादन योग्य "ओवरराइट" कर सकते हैं और फिर पुरानी फ़ाइल के समान नाम के साथ एक नई फ़ाइल बना सकते हैं।

तो, यह एक मौजूदा फ़ाइल को "अधिलेखित" करते समय संकलक निष्पादन योग्य बनाता है। अगर यह सिर्फ लिखने के लिए फ़ाइल खोलता है और इसे छोटा करता है (O_WRONLY|O_CREAT|O_TRUNC), तो यह ETXTBSY त्रुटि के साथ विफल हो जाएगा। यदि यह पहले मौजूदा आउटपुट फ़ाइल को हटा देता है और एक नया बनाता है, तो यह बिना त्रुटि के काम करेगा।

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