Я пытаюсь синхронизировать 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;
}