কাঁটাচামচ () এর পরে, শিশুটি তার মৃত্যুদন্ড কার্যকর করতে কোথায় শুরু করে?


22

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

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);
}

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

এটি সবচেয়ে অবশ্যই পিতামাতার প্রক্রিয়াটি
কোন প্রক্রিয়াটি প্রিন্ট করেছে?
কোন প্রক্রিয়া এটি মুদ্রিত?

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

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

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
man forkআপনার প্রশ্নের উত্তর দেওয়ার জন্য যথেষ্ট নিশ্চিত, বিটিডব্লিউ
অ্যালেক্স

উত্তর:


23

নতুন প্রক্রিয়াটি fork()কলটির মধ্যে তৈরি করা হবে এবং পিতামাতার মতোই এটি থেকে ফিরে শুরু হবে। এর ফিরতি মান (যা আপনি সংরক্ষণ করেছেন retval) fork()তা হ'ল:

  • শিশু প্রক্রিয়া 0
  • পিতামাতার প্রক্রিয়াতে সন্তানের পিআইডি
  • -1 পিতামাতার মধ্যে কোনও ব্যর্থতা থাকলে (কোনও শিশু নেই, স্বাভাবিকভাবেই)

আপনার পরীক্ষার কোডটি সঠিকভাবে কাজ করে; তা থেকে ফেরত মান সঞ্চয় করে fork()child_pidএবং ব্যবহারের ifচেক করতে যদি এটা 0 (যদিও এটা একটি ত্রুটি জন্য চেক না) বা না


13

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

হ্যাঁ। আসুন লাইন সংখ্যা:

int main (int argc, char **argv)
{
    int retval;                                               /* 1 */
    printf ("This is most definitely the parent process\n");  /* 2 */
    fflush (stdout);                                          /* 3 */
    retval = fork ();                                         /* 4 */
    printf ("Which process printed this?\n");                 /* 5 */
    return (EXIT_SUCCESS);                                    /* 6 */
}

কার্যকর করার প্রবাহটি হ'ল:

caller process     fork()  ...
                          
original program            exec()  2  3  4  5  6
                                               
forked program                                   5  6

... যা আপনাকে প্রাপ্ত আউটপুটটি সঠিকভাবে ব্যাখ্যা করে।

যদি আপনি জানতে চান যে আসল এবং কাঁটাচামচ করা প্রোগ্রামটি সম্ভবত অন্যরকম আচরণ করতে পারে, যেহেতু তারা অগত্যা একই কোডটি ভাগ করে নেয়, মাইকেল মরোজকের উত্তর দেখুন।


মনে রাখবেন যে 1 আসলে কোনও নির্দেশ নয়। এছাড়াও নোট করুন যে আসল এবং কাঁটাযুক্ত প্রোগ্রামগুলি একই সময়ে চলবে না - হয় উভয়কেই অপরটির জন্য / অপসারণের জন্য অপেক্ষা করতে হবে ree
Badp

1
মাল্টি-কোর / মাল্টি-সিপিইউ সিস্টেমে, উভয় প্রোগ্রামই একই সময়ে চলতে পারে।
jlliagre

@ জিলিয়াগ্র্রে মাল্টিকোর সিস্টেমগুলি সত্যিই মাল্টিথ্রেডিং সম্পর্কে। একাধিক সিপিইউ সহ সিস্টেমগুলি সম্পর্কে, আমি জানি না এটি বাস্তবে না হয় বা না আমি এই ক্ষেত্রে কোনও বিশেষজ্ঞ নই - এবং এটি কেবল এই জাতীয় সম্ভাবনার মতো দৃশ্য বলে মনে হচ্ছে। যদি আমরা সম্মত হই যে ওএস একই সাথে একাধিক প্রক্রিয়া চালাতে পারে (তবে এটি কীভাবে সম্মতিটি পরিচালনা করবে?), মূল প্রোগ্রামটি কোনও সিপিইউতে নির্দেশিকা 4 পরিচালিত করার সময়, অন্যান্য সিপিইউ সম্ভবত অন্য প্রক্রিয়া চালাতে ব্যস্ত থাকবে ।
Badp

আমি বলব এটি খুব সম্ভবত একটি পরিস্থিতি, বিশেষত যেহেতু একটি অন্তর্নিহিত সিস্টেম কল রয়েছে যার সাথে কিছু আই / ও পদক্ষেপ হয় 5.. সমস্ত সিপিইউ ব্যস্ত থাকা আসলে একটি সাধারণ পরিস্থিতি নয় কারণ সিপিইউ বর্তমান মেশিনগুলির সাথে খুব কমই বাধা হয়ে দাঁড়ায়। দেখে মনে হচ্ছে আপনি বহু-থ্রেডিং এবং মাল্টি-কোরকে বিভ্রান্ত করছেন।
jlliagre

8
এই ত্রিভুজ তীরগুলি দুর্দান্ত বলে আমি কি মন্তব্য করতে পারি ?
JBirch

0

এর আসল সমাধান হ'ল

switch (fork()) {
    case -1 :
        fprintf (stderr, "fork failed (%s)\n", strerror(errno));
        break;
    case 0 :  // child process comes here
        break;
    default : // parent process
        break;
}

// all continue here

-1

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

এখন আপনার আউটপুট দেখুন ...

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