2010-11-17 54 views
0

我正在實現一個簡單的分叉練習,我需要fork 5個新進程,並在每個進程中運行一個函數n次,並獲得完成時間。問題是,他們沒有在子進程被更新,看起來像這樣的代碼:分叉多個進程的問題

#include <stdlib.h> 
    #include <iostream> 
    #include <sstream> 
    #include <ctime> 
    #include <sys/time.h> 
    #include <sys/types.h> 
    #include <unistd.h> 
    #include <sys/wait.h> 
    using namespace std; 

    int f1(string file); 
    int f2(string file); 
    int f3(string file); 
    int f4(string file); 
    int sendpacket(string echoString); 
    typedef int (*ptof)(int,string,double&); 


    int p1(int n, string file, double& elapsed) 
    { 
    struct timeval time; 
    gettimeofday(&time, NULL); 
    double t1 = time.tv_sec + (time.tv_usec/1000000.0); 

    for(int i = 0; i < n; i++) 
    { 
     f1(file); 
    } 

    gettimeofday(&time, NULL); 
    double t2 = time.tv_sec + (time.tv_usec/1000000.0); 
    elapsed = t2-t1; 
    exit(0); 
    return 0; 
    } 

    int p2(int n, string file,double& elapsed) 
    { 
    struct timeval time; 
    gettimeofday(&time, NULL); 
    double t1 = time.tv_sec + (time.tv_usec/1000000.0); 

    for(int i = 0; i < n; i++) 
    { 
     f2(file); 
    } 

    gettimeofday(&time, NULL); 
    double t2 = time.tv_sec + (time.tv_usec/1000000.0); 
    elapsed = t2-t1; 
    exit(0); 
    return 0; 
    } 

    int p3(int n, string file, double& elapsed) 
    { 
    struct timeval time; 
    gettimeofday(&time, NULL); 
    double t1 = time.tv_sec + (time.tv_usec/1000000.0); 

    for(int i = 0; i < n; i++) 
    { 
     f3(file); 
    } 

    gettimeofday(&time, NULL); 
    double t2 = time.tv_sec + (time.tv_usec/1000000.0); 
    elapsed = t2-t1; 
    exit(0); 
    return 0; 
    } 

    int p4(int n, string file, double& elapsed) 
    { 
    struct timeval time; 
    gettimeofday(&time, NULL); 
    double t1 = time.tv_sec + (time.tv_usec/1000000.0); 

    for(int i = 0; i < n; i++) 
    { 
     f4(file); 
    } 

    gettimeofday(&time, NULL); 
    double t2 = time.tv_sec + (time.tv_usec/1000000.0); 
    elapsed = t2-t1; 
    exit(0); 
    return 0; 
    } 

    int p5(int n, string file, double& elapsed) 
    { 
    struct timeval time; 
    gettimeofday(&time, NULL); 
    double t1 = time.tv_sec + (time.tv_usec/1000000.0); 

    for(int i = 0; i < n; i++) 
    { 
     sendpacket(file); 
    } 

    gettimeofday(&time, NULL); 
    double t2 = time.tv_sec + (time.tv_usec/1000000.0); 
    elapsed = t2-t1; 
    exit(0); 
    return 0; 
    } 

    int main(int argc, char** argv) 
    { 
    //read the user value for n 
    int n; 
    string input = ""; 
    pid_t pid1, pid2, pid3, pid4, pid5; 
    while (true) 
    { 
     cout << "Enter a number: "; 
     getline(cin, input); 

     stringstream myStream(input); 
     if (myStream >> n) 
      break; 
     cout << "Invalid number, please try again" << endl; 
    } 

    //reading filename 
    cout << "Enter the name of the file you want read/written and message for sendpacket: "; 
    string f; 
    cin >> f; 

    double elapsedTimes[5]; 
    pid_t processes[5]; 
    ptof functions[5] = {p1, p2, p3, p4, p5}; 
    pid_t pid = fork(); 
    for(int i =0; i<5; i++){ 
     switch(pid){ 
     case -1: 
cout<< "Forking Error" << endl; 
exit(-1); 
     case 0: 
functions[i](n,f,elapsedTimes[i]); 
     default: 
if(i<4){ 
pid = fork(); 
break; 
} 
else if(i==4){ 
    wait(NULL); 
    break; 
     } 
     } 

    }   


    for(int i = 0; i<5;i++){ 
     cout << endl << "Function p" << i+1 << " ran for "; 
     cout << elapsedTimes[i] << " seconds." << endl; 
    } 
    return(0); 
    } 

,這產生這樣的輸出:

功能P1跑持續10秒。

函數p2跑了6.95322e-310秒。

函數p3運行0秒。

函數p4運行時間爲6.95322e-310秒。

函數p5跑了2.122e-314秒。

這是不正確的。我究竟做錯了什麼?

+0

只是說這是不正確的沒有多大用處 - 你期望什麼,這與你實際得到的有什麼不同?也可以嘗試格式化你的代碼(如果可能的話,將代碼減少到*最小*表示問題 - 我懷疑有人會閱讀你發佈的所有內容)。 – 2010-11-17 19:38:15

+0

...尤指被註釋掉的部分。幾乎沒有足夠的代碼塊。讓它先用一個'fork()'調用,然後它應該通過歸納工作。 – 2010-11-17 19:39:14

+0

當你說「他們沒有更新,」我收集你的意思是執行時間沒有被更新?你確定那些顯示0時間的過程實際上在做着工作嗎? – 2010-11-17 19:41:34

回答

0

第一:fork()會產生新的進程,而不是新的線程,所以你聲明的變量不會在它們之間共享。要做這樣的事情 - 你需要線程,而不是進程。

第二:fork()是異步的。它不會等待進程完成,它會在啓動後立即返回(並獲得PID)。我猜你自己想出了這個。