2015-01-31 64 views
0

我用C有這種多進程程序:多處理程序沒有給予期望的輸出

#include <stdio.h> 
#include <unistd.h> 


int main(int argc, char **argv) 
{ 
    pid_t i = fork(); 
    if(i == 0) 
    { 
     execv("./prcs1", (char *[]){ "./prcs1", argv[1], NULL}); 
     _exit(1); 
    } 
    else if (i > 0) 
    { 
     execv("./prcs2", (char *[]){ "./prcs2", argv[0], NULL}); 
     _exit(2); 
    } 
    else 
    { 
     perror("Fork failed"); 
     _exit(3); 
    } 
} 

在這個程序./prcs1./prcs2是兩個不同的程序在兩個可執行文件。 ./prcs1給出輸出爲Syscall finished./prcs2給出輸出Stdlibrary finished。而我得到以下輸出在每次運行:

Syscall finished 
Stdlibrary finished 

現在,我的問題是:

  1. 請問上面的程序運行兩個進程prcs1和並行prcs2
  2. 如果它並行運行,那麼每次我都會得到相同的結果,還是我也可以得到一個輸出,其中Stdlibrary finished排在第一位,Syscall finished排在第二位?如果這是可能的,那麼爲什麼我在每次運行中獲得相同的輸出?
+0

這些需要執行多少時間?例如,如果「Syscall」比「Stdlibrary」快得多,那麼你總會得到相同的結果。 – VHarisop 2015-01-31 21:41:34

+0

@VHarisop當我使用時間分別運行這兩個程序時,我得到:real \t 0m0.044s,用戶0m0.000s,syscall程序的sys 0m0.041s,以及真實的\t 0m0.028s,用戶0m0.019s,sys 0m0 Stdlibrary進程的.001s。那麼,看看這些時候,結果會一直如此嗎? – 2015-01-31 21:49:53

+0

不,他們看起來很可比。你應該看看約阿希姆的答案。 – VHarisop 2015-01-31 21:53:56

回答

2

是的,你創建過程與fork函數。在成功呼叫fork之後,您將有兩個進程以「並行」方式運行。

但是,您對進程調度程序沒有影響,所以首先您不會知道哪個進程將首先運行,除非您知道每個程序執行的時間長短,否則無法預測每個運行多長時間。如果所有兩個外部程序(prcs1prcs2)都打印一條線到標準輸出,則不能確定地首先打印哪條線。

實際上,如果操作系統進程調度程序決定在打印過程中切換進程,則由於兩個進程輸出相互混合,輸出可能會變成亂碼。

+0

當我使用時間分別運行兩個程序時,我得到:真實0m0.044s,用戶0m0.000s,Syscall程序的sys 0m0.041s,以及真正的0m0.028s,用戶0m0.019s,sys 0m0.001s Stdlibrary進程。那麼,看看這些時候,結果會一直如此嗎? – 2015-01-31 21:50:10

+0

@LindaNu正如OP所說,這取決於操作系統的進程調度程序。這意味着它也可能取決於計算機上同時運行的其他軟件以及他們正在使用的資源。 – Degustaf 2015-01-31 21:55:05

+0

@Degustaf:好的,我想我明白了。當我用一些更多的打印語句分析輸出時,我看到它開始使用Stdlibrary進程執行,打印它的一些輸出,然後從Syscall進程開始,打印它的一些輸出並且並行執行;系統調用之前完成,Stdlibrary之後完成,即使之前開始。 – 2015-01-31 22:08:36