2014-12-06 82 views
0

執行我有一個類似的代碼:`叉()`兒子以相反的順序

for (i = 0; i < 3; i++) 
{ 
    pid = fork(); 

    if (pid == 0) 
    { 
     son_function(); 
    } 

    if (pid < 0) 
    { 
     exit(1); 
    } 
} 

void son_function(void) 
{ 
    printf("my pid=%d\n", getpid()); 
    printf("%d: alpha\n", getpid()); 
    printf("%d: beta\n", getpid()); 
    printf("%d: charlie\n", getpid()); 
    exit(0); 
} 

出於某種原因,我無法理解,的son_function()執行的順序是相反的順序。我的意思是son_function()正在打印從最大到最小的PID數字。

另一件令我感到不可思議的事情是,每個兒子的印花都會一個接一個地進行,兩個不同的印花工序將無法同時打印到屏幕上。

樣品可以在這裏看到:http://ideone.com/uBYyRX

+0

'getpid()'返回調用進程的進程ID。你不應該期望_variable_'pid'和函數'getpid()'之間有任何關聯。 – ryyker 2014-12-06 01:33:41

+0

@ryyke,我不是在尋找關聯,我正在尋找執行順序中的某種意義。爲什麼最先打印出'PID'最高的兒子? – Quaker 2014-12-06 01:35:26

+1

使用_pid_數組,即'pid_t pid [3];'。然後通過查看唯一元素(pid [0],...)來追蹤它們。 – ryyker 2014-12-06 01:40:04

回答

1

多個進程可以輸出到控制檯的同時,至少在Linux和Windows。

之所以你能看到所有其中一個進程是由於你的特定OS調度線程的方式。查看此行爲的更好方法是將son_function更改爲類似下面的代碼,其中每個孩子都會休息不同的時間。誰將行交錯(如前所述)是因爲printf緩衝輸出行。

void son_function() 
{ 
    srandom(getpid()); 
    int sleepTime = random() % 4; // random sleep between 0 and 3 seconds 
    printf("pid [%d] sleep time is %d\n", getpid(), sleepTime); 

    printf("my pid = %d\n", getpid()); 
    sleep(sleepTime); 
    printf("alpha = %d\n", getpid()); 
    sleep(sleepTime); 
    printf("beta = %d\n", getpid()); 
    sleep(sleepTime); 
    printf("charlie = %d\n", getpid()); 
    sleep(sleepTime); 
} 
+0

那麼爲什麼打印中沒有碰撞到控制檯?爲什麼兒童1正在以其正確的順序打印,而他的照片之間沒有其他任何兒童(即兒童2)打印? – Quaker 2014-12-06 09:34:05

0

要以正確的順序執行子進程,只需在調用fork函數之前在循環內添加wait函數即可。

所以它會等到孩子終止並且子進程將按正確的順序終止。

 for (i = 0; i < 3; i++) 

      wait(); 
      pid = fork(); 

添加等待函數後執行代碼。