কাঁটাচামচ () আসলে কোথায় শুরু হয়?


4

আমি ইউনিক্স প্রোগ্রামিং শিখার চেষ্টা করছি এবং এ সংক্রান্ত একটি প্রশ্ন এসেছি fork()। আমি বুঝতে পারি যে fork()বর্তমানে চলমান প্রক্রিয়াটির একটি অভিন্ন প্রক্রিয়া তৈরি করে তবে এটি কোথায় শুরু হয়? উদাহরণস্বরূপ, যদি আমার কোড থাকে

int main (int argc, char **argv)
{

    int retval;
    printf ("This is most definitely the parent process\n");
    fflush (stdout);
    retval = fork ();
    printf ("Which process printed this?\n");

    return (EXIT_SUCCESS);
}

আউটপুটটি হ'ল:

This is most definitely the parent process
Which process printed this?
Which process printed this?

আমি ভেবেছিলাম যে কাঁটাচামচ () একটি একই প্রক্রিয়া তৈরি করে, তাই আমি প্রথমে ভেবেছিলাম যে সেই প্রোগ্রামটিতে কাঁটাচামচ () কলটি পুনরাবৃত্তভাবে চিরতরে কল করা হবে। আমার ধারণা যে কাঁটাচামচ () থেকে তৈরি নতুন প্রক্রিয়াটি কাঁটাচামচ () কলটির পরে শুরু হয়?

যদি আমি নীচের কোডটি যুক্ত করি তবে পিতামাতা এবং সন্তানের প্রক্রিয়াটির মধ্যে পার্থক্য করতে,

if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());

কাঁটাচামচ () কল করার পরে, শিশু প্রক্রিয়াটি তার প্রয়োগ শুরু করে কোথায়?


এছাড়াও, আমি কোডটি কীভাবে ফর্ম্যাট করব? =)

কোডটির পুরো ব্লকটি ফর্ম্যাট করতে চারটি স্পেসে প্রবেশ করুন।
স্টেফানো প্যালাজো

উত্তর:


5

প্রকৃত forkকাঁটাচামচ আদিমের ভিতরে ঘটে fork()

আপনি কেবল কল্পনা করতে পারেন যে কোডের অভ্যন্তরে forkএকটি সিস্টেম কল প্রকৃতিকে নকল করে এবং কিছুটা পার্থক্য সহ একই পয়েন্টে তাদের সম্পাদন শুরু করে:

  • অভিভাবক প্রক্রিয়া forkফাংশন শিশু প্রক্রিয়াটির প্রসেস আইডি ফিরিয়ে দেবে
  • শিশু প্রক্রিয়া forkফাংশন 0 ফিরে আসবে।

উদাহরণস্বরূপ, আপনি প্রোগ্রামিং চলাকালীন আপনি কোথায় আছেন তা জানেন

  if (fork())
  {
     printf("Parent speaking\n");
     // parent's tasks
  }
  else
  {
     printf("Child here\n");
     // child's tasks
  }

4

কাঁটাচামচ () বর্তমানে যে অবস্থায় রয়েছে তার মধ্যে যে প্রক্রিয়াটি তৈরি করা হয়েছে তা অনুলিপি করবে *

শিশু প্রসেসটি কোন কোডের লাইনে শুরু হয় তা বলা শক্ত হতে পারে, আপনি বুঝতে সত্যিই একটি বিচ্ছিন্ন সংকলিত সংস্করণটি দেখতে হবে। তবে কাঁটাচাঁটির ডাকা হওয়ার পরে এটি অবশ্যই শুরু হয় তা ধরে নেওয়া ঠিক হবে, অবশ্যই আপনার ক্ষেত্রে।

এটি তার সমস্ত ভেরিয়েবল, স্ট্যাক, সম্পূর্ণ জিনিসটি অনুলিপি করছে (এটি আসলে মেমরির স্থান) বাইট দ্বারা অনুলিপি করা হয়। একমাত্র যেটি পরিবর্তন হয় তা হ'ল প্রক্রিয়া আইডি **।

আপনি যদি এটি করেন:

int i = random_integer();
fork();

শিশু প্রক্রিয়াটির iএটির পিতামাতার জন্য একই মান থাকবে ।

*: শিশু প্রক্রিয়াতে, কাঁটাচামড়ার () রিটার্নের মান প্রক্রিয়া আইডির পরিবর্তে 0 হবে।

**: এছাড়াও, শিশু প্রক্রিয়াতে পিতামাতার লক এবং সংস্থান ব্যবহারের ব্যবস্থা থাকবে না


2

fork()কল প্রক্রিয়া শুরু হওয়ার সাথে সাথে শিশু প্রক্রিয়াটি কার্যকর করা শুরু করে । আরও সুনির্দিষ্টভাবে, কাঁটাচামচ (ডানদিকের) পরে সন্তানের প্রক্রিয়াগুলির আইডি বা 0 ফিরিয়ে দিয়েছে।

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