else - if statement in c example




if/else if/else का निष्पादन एक fork() के साथ (3)

मैंने एक ओएस कार्यक्रम को लागू करने की कोशिश की है यहां कोड है:

#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>

int main()
{
    pid_t pid, pid1;

    pid = fork();

    if(pid<0)
    {
            fprintf(stderr,"Fork Failed");
            return 1;
    }

    else if(pid == 0) /* child process */
    {
            pid1 = getpid();
            printf("child: pid = %d\n",pid);
            printf("child: pid1 = %d\n",pid1);

    }

    else   /* parent process */
    {
            pid1 = getpid();
            printf("parent: pid = %d\n",pid);
            printf("parent: pid1 = %d\n",pid1);

    }

    return 0;
}

और इसके ओ / पी:

parent: pid = 1836
parent: pid1 = 1835
child: pid = 0
child: pid1 = 1836

क्या कोई मुझे बता सकता है कि यह कैसे काम कर रहा है, यानी कोड में लिखा if / else-if / else बयान के लिए निष्पादन का क्रम। मुझे लगता है कि एक बार else if हालत सही हो जाती है तो else भाग निष्पादित नहीं होता है, यद्यपि यहां उसने पेरेंट प्रोसेस ऑब्जेक्ट को अंजाम दिया है else हिस्सा ..... और कैसा हुआ?


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

 int main()
 {
   pid_t pid, pid1;
                   <--- up to here you have one process running
   pid = fork();   <--- when this returns you have two processes:
                          parent has pid = child's pid               child has pid = 0


   if(pid<0)       <--- child and parent both check this, it's not true so they move on
   {
     ....
   }
   else if(pid == 0)<--- this is true for the child, not the parent
   {
     ....           <--- child will now execute this code
   }
   else             <-- nothing else was true for the parent so it sees this
     ....           <-- and executes this code

तो हां, आप सही हैं, एक बार आप if , या else if आप एक ही प्रक्रिया 'निष्पादन में , कोड के किसी अन्य शाखा में नहीं जा रहे हैं मारा जब मारा। आप else if देख रहे हैं क्योंकि आपके पास दो प्रक्रियाएं चल रही हैं

ध्यान दें कि कैसे pid1 अलग है, क्योंकि getpid() लौट रहा है जो कि प्रक्रिया चल रहा है उस कोड, और आप देख सकते हैं कि आपके पास दो अलग-अलग प्रक्रियाएं हैं, अन्य else if दूसरे विकल्प को चुनता है


कांका () एक नई प्रक्रिया बनाता है, जो मूल प्रक्रिया से स्वतंत्र निष्पादन है।

अगर आपका भाग नया है तो आपकी नई बच्ची प्रक्रिया चलती है।

आपकी मौजूदा अभिभावक प्रक्रिया else तरफ चलाती है।

आपके बच्चे और माता-पिता की प्रक्रिया के बीच निष्पादन के आदेश निर्धारित नहीं हैं, वे अब अलग प्रक्रियाएं हैं और ओएस चलाने के लिए उन्हें शेड्यूल करेगा हालांकि कर्नेल को ऐसा लगता है। यह अधिक या कम यादृच्छिक हो सकता है कि माता-पिता या बच्चे की प्रक्रिया पहले उसका कोड चलाते हैं।

तुम भी बच्चे से printfs और माता पिता interleaved सकता है।


दो अलग-अलग प्रक्रियाएं हैं जो आपके प्रोग्राम को चला रही हैं। fork की कॉल के बाद, निम्नलिखित निर्देशों के दो फांसी हैं, और उनके पास pid विभिन्न मूल्य हैं। तो दोनों else if else भागों को निष्पादित किया जाता है, तो दो प्रक्रियाओं में से प्रत्येक





fork