2017-01-09 16 views
0

同じプログラムでは、関数の実行時間は計算できますが、別のプログラムでは他のプログラム(cプログラム)の実行時間を計算する方法があります。私はexecve()とclock()とsystem()を使ってみましたが、プログラムの実行時間は になりませんでした。cとlinuxのプログラム実行時間を計算する

例:あなたは、元のコードに取得することはできませんので、コールexecあなたのコードを有する後にクリアされているのであなたは、時計にあなたがした方法を使用することはできません

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<signal.h> 
#include<time.h> 

main(int argc, char *argv[]) 
{ 

    pid_t child; 
    pid_t tpid; 

    int status; 
    char *envp[] = {NULL}; 
    char *newargv[] = {argv[1],argv[2],argv[3],NULL}; 
    clock_t start, end; 
    double time_taken; 

    child = fork(); 

    if(child == 0) 
    { 


     printf("in child\n"); 
     start = clock(); 
     execve(argv[1], newargv,envp); 
     end = clock(); 
     time_taken = ((double)(end - start))/CLOCKS_PER_SEC; 
      printf("fun() took %f seconds to execute \n", time_taken); 

     exit(1); 
    } 

     if(child != 0) 
    { 
     /* This is run by the parent. Wait for the child 
     to terminate. */ 
// end = clock(); 
// time_taken = ((double)(end - start))/CLOCKS_PER_SEC; 
// printf("fun() took %f seconds to execute \n", time_taken); 
    printf(" in parent\n"); 
     do { 
     pid_t tpid; 
    tpid = wait(&status); 
//   if(tpid != child) process_terminated(tpid); 
     }while(tpid != child); 

     //return status; 
    } 
} 
+0

あなたは思考に問題があります。「exec」ファミリの関数ファミリは、エラーがある場合のみ返します。エラーがなければ、決して戻りません。 –

+0

'fork'を呼び出す前に*の開始時刻を記録する必要があります。そして、終了時刻は親の「待ち」の後です。 – user3386109

答えて

1

。あなたはの前にforkと電話をしてから、waitの後に子供の消費時間の悪い近似を呼び出すことができます。

あなたは子プロセスが消費した時間を追跡するには、2つの基本的な機能があります。

clock_t times(struct tms *tp); 

あなたの発信者と子どもたちが消費したユーザとシステムの時間を与えます。

int getrusage(int who, struct rusage *r_usage); 

追跡対象のユーザー(自己または子供)を選択して、追跡されたプロセスの実行に関するさらに詳細な情報を提供できます。

子(ren)が終了するのを待ってからこれらの2つのうちの1つを呼び出してください。

関連する問題