2012-11-14 95 views
3

我試過實現一個os程序。下面是代碼:執行if/else if/else與fork()

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

和O/P:

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

有人可以給我解釋一下它是如何工作的,即執行了寫在if/else-if/else語句序列代碼。我認爲一旦else if條件成爲真,那​​麼else部分不會執行,但是在這裏它已經執行了父處理部分,即else部分,然後是子部分.....怎麼回事?

+0

'如果'和'else'將在父母和子女的背景下執行 –

+2

如果你不懂fork(),我是唯一一個在思考「實現os程序」的智慧的人嗎? – Vicky

回答

5

您應該閱讀fork()。一旦你點擊一個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 ifelse你不打算進入的代碼,的另一分支在一個進程的執行。您看到else ifelse,因爲您有兩個進程在運行。

注意pid1的有何不同,因爲getpid()將返回哪些進程正在運行的代碼,你可以看到你有兩個不同的過程,一個採else if其他採else

+0

謝謝:)!一個非常好的解釋.......我已經完全理解了這個 –

+0

@POOJAGUPTA - 高興地幫忙! – Mike

2

有兩個不同的進程正在運行你的程序。在fork的呼叫之後,執行了以下兩條指令,它們具有不同的值pid。因此,else ifelse部分均通過兩個進程中的一個執行。

3

man fork

叉實際上返回zero子進程ID和non-zero父意味着孩子的實際進程ID返回給父

else if(pid ==0) {...}後子進程

else {...}是父進程。

fork的基本含義是創建新進程。

如果主要調用一個fork()那麼只有孩​​子是用它自己的地址空間創建的。就在fork調用的下面,父進程和子進程的所有語句都是相同的。

用叉子創建進程意味着這兩個parentchild是獨立的過程中,默認情況下

但在fork調用後,你的情況下它們之間不共享任何數據這兩個是獨立的所以執行的順序這兩個過程是未指定的。 你可能會得到這些東西:

1. parent executed and program terminates 
parent: pid = 1235 
parent: pid1 = 1234 


2. child executed then parent and then program terminates : 
child : pid = 0 
child :pid1 = 1235 
parent : pid = 1235 
parent :pid1 = 1234 

如果你想確保孩子必須執行先父shloud退出。 在母代碼wait(NULL);中寫入一行作爲else{..}的第一條語句 這意味着父母將等到孩子終止。

3

fork()創建一個新的進程,它具有獨立於原始進程的執行。

您的新子進程運行else if部件。

您現有的父進程運行else部分。

您的子進程和父進程之間的執行順序不確定,它們現在是不同的進程,操作系統會安排它們運行,但內核感覺像。無論父進程還是子進程首先運行其代碼,它都可能是隨機的。

你甚至可以從子和父交錯的printfs。