C fork(),wait4()问题

时间:2012-01-09 02:58:33

标签: c linux fork

我正在尝试使用fork计算wait4'ed流程,但stimeutime的rusage返回值始终为零。我已经验证了该过程正确forkexec'正确,并且当我>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;
}

1 个答案:

答案 0 :(得分:1)

系统定时器可能具有纳秒级分辨率,但您需要一个专为实时操作而设计的系统,以便充分利用您可以看到的那种定时分辨率。我在这里的非Linux系统上试过你的代码。在Pentium III上运行的旧FreeBSD系统有时会打印0,有时会打印4e-03。最近的PowerPC和Intel Macs在4e-05到2e-04范围内打印数字。