2017-02-09 52 views
1

說我有一個片的代碼叉()過程行爲

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

int main() 
{ 
    pid_t p ; 
    p = fork(); // p is a new process 
    // three cases -1, 0 , >0 
    // -1 will report the error 
    // 0 will tell us that the process is created 
    int i =0 ; 
    switch(p) 
    { 
    case -1 : printf("Error; \n"); 
       break; 

    case 0: printf("I am child and my pid is %d",getpid()); 
      printf("\nMy parent pid is : %d\n",getppid()); 
      break; 

    default:printf("You are inside parent whose pid is %d\n",getpid()); 
      for (int i =20 ; i <= 29; i++) 
      { 
       printf("%d\n",i); 
      } 
      break; 
    } 
} 

該代碼在不同的操作系統給不同的輸出。我的系統上有Ubuntu 14.04,我們大學實驗室的操作系統是Red Hat,當我們在不同的機器上執行相同的程序時,輸出是不同的。 輸出類似(在我的系統):

You are inside parent whose pid is 5283 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
I am child and my pid is 5284 
My parent pid is : 5283 

,哪一個是實驗室內的系統給輸出像

I am child and my pid is 5284 
My parent pid is : 5283 
You are inside parent whose pid is 5283 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 

如果我們檢查程序認真,在我的系統的輸出父母首先完成任務,然後將控制權交給子進程,而在另一個系統上父進程首先創建子進程,子進程首先完成其任務,然後恢復到父進程。那有什麼區別?它是否依賴於系統架構或任何其他參數,如操作系統。請讓我們知道

+0

[可以確定fork()的執行順序嗎?](http://stackoverflow.com/questions/6696959/can-the-order-of-execution-of-fork-be-determined ) – GSerg

+0

總之,沒有什麼可以說他們的執行的相對順序。 它取決於調度程序依賴的調度算法。一般情況下,許多算法給予子進程更高的優先級,因爲在大多數情況下,子進程被創建爲運行不同的程序,因此如果父進程先運行,則不會爲父進程複製頁面... –

回答

1

它只取決於系統的調度程序。如果您在同一臺機器上多次啓動程序,結果可能會有所不同。

只要兩個進程同時啓動,就不能在它們的指令之間假定執行順序。