我正在尝试使用fork
计算wait4
'ed流程,但stime
和utime
的rusage返回值始终为零。我已经验证了该过程正确fork
,exec
'正确,并且当我>0
测试过程时,rusage值是合理的(exec
)它只会占用时钟周期几秒钟。
我怀疑正在使用的时钟分辨率不足以正确计算短流程的时间,但是a)我得到1ns
对所查询的所有clockid_t
类型的响应,以及b)我可以看不出有任何方法可以指定wait4()
应使用哪个时钟。
这是我的代码:
double spawnprocess(char *arg1, char *arg2){
struct rusage usage;
struct timeval time;
double t1 = 0.0;
int nogo;
pid_t pid;
char* args[] = { "/path/to/process", arg1, arg2, (char *) 0 };
do {
pid = fork();
if (pid == -1) { printf("Error forking... trying again.\n"); sleep(1); }
} while (pid == -1);
if (pid == 0) {
if ((nogo=execv(args[0], args)) == -1) printf("Error starting new process.\n");
} else {
printf("Waiting for child %d...\n", pid);
int status;
int options = 0;
pid_t cpid = wait4(pid, &status, options, &usage);
if (cpid != pid) {
printf("Error: %d\n", cpid);
int tmp;
if (WIFEXITED(status)) printf("%s", "WIFEXITED");
if ((tmp = WEXITSTATUS(status))) printf("WEXITSTATUS: %d", tmp);
if (WIFSIGNALED(status)) printf("%s", "WIFSIGNALED");
if ((tmp = WTERMSIG(status))) printf("WTERMSIG: %d", tmp);
if (WCOREDUMP(status)) printf("%s", "Core dumped.");
if (WIFSTOPPED(status)) printf("%s", "WIFSTOPPED");
if (WSTOPSIG(status)) printf("%s", "WSTOPSIG");
if (WIFCONTINUED(status)) printf("%s", "WIFCONTINUED");
} else {
t1 = (usage.ru_utime.tv_sec + (usage.ru_utime.tv_usec/1000000.0));
}
}
printf("Sent value is: %e\n", t1);
return t1;
}
答案 0 :(得分:1)
系统定时器可能具有纳秒级分辨率,但您需要一个专为实时操作而设计的系统,以便充分利用您可以看到的那种定时分辨率。我在这里的非Linux系统上试过你的代码。在Pentium III上运行的旧FreeBSD系统有时会打印0,有时会打印4e-03。最近的PowerPC和Intel Macs在4e-05到2e-04范围内打印数字。