সুতরাং যখন শেল থেকে একটি আদেশ সরিয়ে ফেলা হয়, কাঁটাচামচ () এর একটি শিশু প্রক্রিয়া উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং এক্সিকিউট () শিশু প্রক্রিয়াটিকে মেমোরিতে লোড করে এবং সম্পাদন করে।
বেশ না। fork()
অভিন্ন শিশু তৈরি করে বর্তমান প্রক্রিয়াটিকে ক্লোন করে। বিদ্যমান প্রোগ্রামটি প্রতিস্থাপন করে বর্তমান প্রক্রিয়াতে exec()
একটি নতুন প্রোগ্রাম লোড করে ।
আমার কিউএসটি হ'ল:
যদি শিশু প্রক্রিয়াতে পিতামাতার প্রক্রিয়ার সমস্ত বৈশিষ্ট্য থাকে (যা মূল প্রক্রিয়া) থাকে তবে এই শিশু প্রক্রিয়াটির কী প্রয়োজন? মূল প্রক্রিয়াটি মেমরিতে লোডও করা যেতে পারে।
প্রয়োজনটি হ'ল কারণ পিতামাতার প্রক্রিয়াটি এখনও শেষ করতে চায় না; এটি একটি নতুন প্রক্রিয়া বন্ধ হয়ে যেতে চায় এবং একই সাথে এটি কার্যকর করতে থাকে এমন একই সময়ে এমন কিছু করতে চায়।
এই কাঁটাচামচ এবং সম্পাদনা ধারণাটি কি ইউনিক্সের সমস্ত এক্সিকিউটেবল প্রোগ্রামের জন্য প্রযোজ্য? শেল স্ক্রিপ্টের মতো বা কেবল কমান্ডের জন্য? এটি শেল বিল্টিন কমান্ডগুলির জন্যও প্রযোজ্য?
বাহ্যিক কমান্ডগুলির জন্য, শেলটি এমনভাবে কাজ করে fork()
যাতে কমান্ডটি একটি নতুন প্রক্রিয়াতে চলে। বিল্টিনগুলি কেবল শেল দ্বারা সরাসরি চালিত হয়। আরেকটি উল্লেখযোগ্য কমান্ড হ'ল exec
, যা exec()
প্রথম fork()
শৃঙ্খলাবদ্ধ না করেই শেলটি বহিরাগত প্রোগ্রামকে বলে । এর অর্থ হ'ল শেলটি নিজেই নতুন প্রোগ্রামের সাথে প্রতিস্থাপিত হয়েছে, এবং সেই প্রোগ্রামটি যখন প্রস্থান করে তখন আর ফিরে আসবে না। যদি আপনি বলে থাকেন, exec true
তবে /bin/true
আপনার শেলটি প্রতিস্থাপন করবে এবং তাত্ক্ষণিকভাবে প্রস্থান করবে, আপনার টার্মিনালটিতে আর কিছুই চলবে না, তাই এটি বন্ধ হয়ে যাবে।
লেখার ধারণার অনুলিপিটি কখন ব্যবহার করা হয় যদি আমি একটি কমান্ড / স্ক্রিপ্ট কার্যকর করি?
পাথরের যুগে ফিরে fork()
আসার জন্য , আসলে কলিং প্রসেসের সমস্ত স্মৃতিকে নতুন প্রক্রিয়াতে কপি করতে হয়েছিল। লিখিত অনুলিপিটি এমন একটি অপ্টিমাইজেশন যেখানে পৃষ্ঠার টেবিলগুলি সেট আপ করা হয় যাতে দুটি প্রক্রিয়া একই মেমরির সমস্ত ভাগ করে নেওয়া শুরু করে এবং প্রয়োজনের সময় কেবল উভয় প্রক্রিয়া দ্বারা লিখিত পৃষ্ঠাগুলি অনুলিপি করা হয়।