2012-04-15 16 views
1

こんにちは私はOSクラスのプロジェクトで作業中に少し問題に遭遇しています。 getrusage()を使用して、私が書いているプログラムのユーザーモードとカーネルモードの両方で費やされた時間を判断するように指示されています。問題は、CPUとカーネルの使用率がゼロであることが常にわかっていることです。関数を調べると、rusage構造体のメンバーのいくつかがあなたの特定のバージョンのLinuxでサポートされていない場合、ZEROに設定されているということがmanページに記載されています。基本的には、私の関数呼び出しとそのパラメータへのアクセスが正しいかどうか誰かに教えてもらえるかどうか疑問に思っていました(問題があるかどうか、私のカーネルでサポートされていないかどうかを知ることができます)。getrusage issues

コード

struct rusage usage; 
struct rusage *p = &usage; 

getrusage(RUSAGE_SELF, p); 

printf("time in user mode = %ld\ntime in kernel mode = %ld\n", p->ru_utime.tv_sec, p->ru_stime.tv_sec); 
+0

私にはうまく見えます。 getrusageを呼び出したときにプロセスが実行されている時間はどれくらいですか? [times](http://linux.die.net/man/2/times)とは何ですか? – Mikel

+2

getrusageの戻り値が-1かどうかを確認する必要があります。次に、errnoに何が間違っているかを確認します。 – Mikel

+0

私はそれをして、それはうまく戻ります。私はこの時点では、これらの値を設定していないことを確信しています。これは、構造体のメンバーの一部にアクセスできるようにするためです。スレッドのCPU使用率を取得するための代替提案がありますか? –

答えて

4

struct rusageメンバーru_utimeru_stimeはこのようになりますこれは、タイプstruct timevalの両方です:

struct timeval { 
    time_t  tv_sec;  /* seconds */ 
    suseconds_t tv_usec; /* microseconds */ 
}; 

tv_secはあなた経過秒数を伝え、tv_usecがわかります残りのマイクロ秒数。したがって、timeval全体を印刷する場合は、両方を印刷する必要があります。

tv_secメンバーだけが印刷されているため、プログラムの実行時間が0秒を超えていない可能性があります。

printf("time in user mode = %ld.%06ld ", 
    p->ru_utime.tv_sec, p->ru_utime.tv_usec); 
printf("time in kernel mode = %ld.%06ld\n", 
    p->ru_stime.tv_sec, p->ru_stime.tv_usec); 

あなたはtimeval構造を印刷する他の方法についてはthe question I linkedを見ることができます:あなたはまた、other values印刷する必要があります。

+0

ありがとう、ティモシーはとても役に立ちました – cpowel2