2010-10-16 getrusage
#include <stdio.h>
#include <sys/resource.h>
#include <sys/param.h>
int
main(int argc, char *argv[])
{
struct rusage r;
int i;
for (i = 0; ; i++) {
#if 1
int j;
if ((i % 30) == 0) {
for (j = 0; j < 1000000; j++)
;
}
#endif
getrusage(RUSAGE_SELF, &r);
#ifdef __FreeBSD__
printf("%8d.%06ld\n", r.ru_stime.tv_sec, r.ru_stime.tv_usec);
#elif defined(__NetBSD__)
#if (__NetBSD_Version__ >= 599000700)
printf("%8llu.%06d\n", r.ru_stime.tv_sec, r.ru_stime.tv_usec);
#else
printf("%8ld.%06ld\n", r.ru_stime.tv_sec, r.ru_stime.tv_usec);
#endif
#else
printf("%8ld.%06ld\n", r.ru_stime.tv_sec, r.ru_stime.tv_usec);
#endif
fflush(stdout);
}
return 0;
}
をNetBSDで実行したら
:
0.010464
0.010465
0.010465
0.010465
0.009998
0.009998
0.009999
0.009999
:
のように ru_stime が巻き戻ることがある。豪謎。
#if 1 の空ループを入れると起きやすくなるっぽい気がする。
(でも入れなくても起きた)
スケジューラまわり? 忙しいので詳細調査は後日。
EOF