Проблема с разветвлением нескольких процессов - PullRequest
0 голосов
/ 17 ноября 2010

Я реализую простое упражнение на разветвление, в котором мне нужно разветвить 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 работала в течение 0 секунд.

Функция p2 работала в течение 6,95322e-310 секунд.

Функция p3 работала в течение 0 секунд.

Функция p4 работала в течение 6,95322e-310 секунд.

Функция p5 работала в течение 2,122e-314 секунд.

что неверно. Что я делаю не так?

1 Ответ

0 голосов
/ 17 ноября 2010

Первое: fork() будет порождать новый процесс, а не новый поток, поэтому объявленные вами переменные НЕ будут разделены между ними.Чтобы сделать что-то подобное - вам понадобятся потоки, а не процессы.

Второй: fork() асинхронный.Он не ожидает завершения процесса, он возвращается, как только он запущен (и PID получен).Полагаю, ты сам это понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...