C fork (), wait4 () проблема - PullRequest
       5

C fork (), wait4 () проблема

1 голос
/ 09 января 2012

Я пытаюсь синхронизировать fork 'ed процесс с wait4, однако возвращаемое значение rusage постоянно равно нулю как для stime, так и utime. Я проверил, что процесс fork 'корректно обрабатывается, exec' правильно, а значение rusage является нормальным (>0), когда я 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 Ответ

1 голос
/ 09 января 2012

Системные таймеры могут иметь наносекундное разрешение, но вам понадобится система, предназначенная для работы в режиме реального времени, для того, чтобы вы могли в достаточной степени уйти, чтобы вы могли видеть такого рода временное разрешение. Я попробовал ваш код на не Linux системах, которые у меня здесь. А старая система FreeBSD, работающая на Pentium III, иногда печатает 0, а 4e-03 в другой раз. Более поздние версии PowerPC и Intel Macs печатают номера в диапазоне от 4e-05 до 2e-04.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...