2017-09-08 11 views
-1

複数の子プロセスの実行時間を計算するには、並列に実行され、同じ親を持つようにフォークされていますか?次のコードは、並列に実行するプロセスをフォークするか、または連続して実行しますか?同時に実行されているすべての子プロセスの合計実行時間を計算する方法は?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <time.h> 
void forkChildren (int nChildren) { 
    int i,j; 
    pid_t pid; 
    pid_t my_id; 
    clock_t start, end; 
    double cpu_time_used; 
    for (i = 1; i <= nChildren; i++) { 
     pid = fork(); 
     if (pid == -1) { 
      /* error handling here, if needed */ 
      return; 
     } 
     if (pid == 0) { 
     /* printf("I am a child: %d PID: %d\n",i, getpid());*/ 
      for(j=0;j<20000000;j++) 
      { 
       if(j%100==0) 
       { 
        my_id = getpid(); 
       } 
      } 
      return; 
     } 
    } 
} 

int main (int argc, char *argv[]) { 
clock_t start,stop; 
double elapsed; 
start = clock(); 
    if (argc < 2) { 
     forkChildren (2); 
    } else { 
     forkChildren (atoi (argv[1])); 
    } 
    stop = clock(); 
    elapsed = (double)(stop - start) * 1000.0/CLOCKS_PER_SEC; 
    printf("Time elapsed in ms: %f", elapsed); 
    return 0; 
} 

前のコードでは、複数の出力実行時間が生成されていましたが、各プロセスごとに別々に考えています。すべてのforkされたプロセスが実行するのにかかる実行時間を計算したいと思います。

enter image description here

答えて

1

あなただけのすべての子プロセスが終了するまで親プロセスでブロックする必要があります。

pid = fork(); 
if (pid == -1) { 
    /* error handling here, if needed */ 
    return; 
} 
if (pid == 0) { 
    /* printf("I am a child: %d PID: %d\n",i, getpid());*/ 
    for (j = 0; j < 20000000; j++) { 
    if (j % 100 == 0) { 
     my_id = getpid(); 
    } 
    } 
    return; 
} else { 

    while (pid = waitpid(-1, NULL, 0)) { 
    if (errno == ECHILD) { 
     break; 
    } 
    } 
} 

子プロセスが残っていないし、次に返しされるまで、親はwhileループにハングします。したがって、すべての子どもが実行を完了するために必要な合計時間を計算します。

関連する問題