संकलन कैसे जारी रखता है?


11

मुझे पता है कि मैं makeपूरे स्रोत के पेड़ को फिर से जोड़ने के बिना किसी भी प्रक्रिया को कभी भी बाधित कर सकता हूं । जैसा कि मुझे पता है, makeकेवल एक लक्ष्य को संकलित करता है यदि यह अभी तक संकलित नहीं किया गया है, या अंतिम संकलन के बाद स्रोत कोड को संशोधित किया गया है।
लेकिन अगर मैं बीच में आता हूं make, तो निश्चित रूप से एक या एक से अधिक (समवर्ती स्तर के आधार पर) आधे-तैयार बायनेरी होंगे। अगली बार जब मैं चलाऊंगा तो यह उनके साथ क्या करेगा make? या यह वर्तमान लक्ष्य को पूरा करता है जब मैं आंशिक रूप से संकलित बायनेरिज़ से बचने के लिए Ctrl+ दबाता हूं C?


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

जवाबों:


12

सरल शब्दों में, आप makeएक (संभवतः बड़ी) चरणों की संख्या के रूप में सोच सकते हैं , जहां प्रत्येक चरण इनपुट के रूप में कई फ़ाइलों को लेता है और आउटपुट के रूप में एक फ़ाइल बनाता है।

एक कदम हो "संकलन हो सकता है file.cकरने के लिए file.oया" उपयोग " ldलिंक करने के लिए main.oऔर file.oमें program"। आप में बाधा डालते हैं makeके साथ CtrlCहै, तो वर्तमान में क्रियान्वित कदम समाप्त हो जाएगा जो होगा (या होना चाहिए) आउटपुट फ़ाइल उस पर काम कर रहा था हटा दें। आमतौर पर कोई "आधा-तैयार बायनेरी" पीछे नहीं रहता है।

जब आप पुनः आरंभ करते हैं make, तो यह सभी इनपुट और आउटपुट फाइलों के टाइमस्टैम्प्स को देखेगा और उन चरणों को फिर से करेगा जहाँ:

  • इनपुट फ़ाइल में आउटपुट फ़ाइल की तुलना में एक नया टाइमस्टैम्प है
  • आउटपुट फ़ाइल मौजूद नहीं है

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

आपके औसत की वास्तविकता Makefileउपरोक्त विवरण की तुलना में काफी अधिक जटिल है, लेकिन मूल तत्व समान हैं।


8

Ctrl+ चल रही प्रक्रिया को भेजे जाने का Cकारण बनता है SIGINT। इस सिग्नल को प्रक्रिया द्वारा पकड़ा जा सकता है। स्रोत स्रोत कोड में आप इस संकेत के लिए एक जाल पा सकते हैं commands.c:

  /* If we got a signal that means the user
     wanted to kill make, remove pending targets.  */

  if (sig == SIGTERM || sig == SIGINT

  ... remove childrens ...

  /* Delete any non-precious intermediate files that were made.  */

  remove_intermediates (1);

remove_intermediates()की सफाई कार्य है make, यह परिभाषा यहाँ देखें:

/* Remove all nonprecious intermediate files.
   If SIG is nonzero, this was caused by a fatal signal,
   meaning that a different message will be printed, and
   the message will go to stderr rather than stdout.  */

और बाद में आपके द्वारा देखे जाने वाले फ़ंक्शन में, उन्हें प्रभावी रूप से हटा दिया जाएगा:

status = unlink (f->name);

निष्कर्ष: आम तौर पर एक संकलन में बाधा डालने से नहीं डरते make। यदि यह एक अनचाहे संकेत ( SIGKILL, SIGSEGV, SIGSTOP) नहीं है, तो यह मध्यवर्ती फ़ाइलों की सफाई करेगा।


1
SIGSEGVकई यूनियनों पर उपलब्ध है।
क्रिस डाउन

1

जब कुछ बंद हो जाता है make(यह ctrl-C, शटडाउन, या यहां तक ​​कि एक कमांड जो विफल हो जाता है), काम पहले से ही रहता है। जब बहाल किया जाता है, makeहमेशा की तरह: यह पता लगाता है कि अभी भी क्या करने की जरूरत है (क्योंकि एक फ़ाइल को बदल दिया गया या makeइसे संसाधित किया गया कभी नहीं मिला) इससे कोई फर्क नहीं पड़ता और नौकरी के साथ आगे बढ़ता है।

उपरोक्त विवरण स्पष्ट रूप से प्रासंगिक है Makefileकि निर्भरता का वर्णन करता है और सही ढंग से निष्पादित करने के लिए आदेश देता है, इसलिए सभी को जो बनाया जाना चाहिए (पुनः) है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.