কীভাবে সংকলন চালিয়ে যায়?


11

আমি জানি যে আমি makeপুরো উত্স ট্রিটি পুনরায় সংকলন না করে যে কোনও সময় কোনও প্রক্রিয়া বাধতে পারি। আমি জানি, makeকেবলমাত্র একটি টার্গেট সংকলন করে যদি এটি এখনও সংকলিত হয় না, বা সোর্স কোডটি শেষ সংকলনের পরে সংশোধিত হয়।
তবে আমি যদি বাধা দেয় makeতবে অবশ্যই এক বা একাধিক (সমঝোতার স্তর অনুসারে) অর্ধ-প্রস্তুত বাইনারি থাকবে। পরের বার দৌড়াতে তাদের সাথে এটি কী করবে make? বা আমি আংশিকভাবে সংকলিত বাইনারিগুলি এড়াতে Ctrl+ টিপে যখন এটি বর্তমান লক্ষ্যটি শেষ করে C?


2
কম্পিউটারটি অপ্রত্যাশিতভাবে চালিত হলে কেবল আপনাকেই চিন্তা করতে হবে। কয়েকবার আমার উবুন্টু কার্নেল অচলাবস্থায় (বা যা কিছু হোক) get
অ্যালভিন ওয়াং

উত্তর:


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কোনও কিছু বন্ধ হয়ে যায় (এটি সিটিআরএল-সি, শাটডাউন, এমনকি কোনও কমান্ড যা ব্যর্থ হয়) তখনও কাজটি স্থির থাকে s পুনঃস্থাপন করা হলে, makeসর্বদা হিসাবে কাজ করে: এটি এখনও কী করা দরকার তা নির্ধারণ করে (কারণ কোনও ফাইল পরিবর্তন হয়েছে বা makeএটির প্রক্রিয়াজাতকরণ কখনই পায়নি) এবং কাজটি চালিয়ে যায়।

উপরের বর্ণনাটি প্রাসঙ্গিকভাবে পরিষ্কারভাবে নির্ধারণ Makefileকরে যে সঠিকভাবে সম্পাদন করার জন্য নির্ভরতা এবং আদেশগুলি বর্ণনা করে, তাই যা করা দরকার (পুনরায়) করা দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.