2016-11-11 5 views
0

У меня есть простая функция, которая создает дочерний процесс, ждет его завершения и печати системы ЦП и времени пользователя.Rusage with wait4() не показывает процессорное время готового дочернего процесса

int PrintChildProcessTime(char **arg) 
{ 
    pid_t pid; 
    int status; 
    struct rusage usage; 

    if ((pid=fork()) == 0) 
    { 
     execvp(arg[0],arg); 

     perror("Execvp error"); 
     _exit(1); 
    } 
    else if (pid > 0) 
    { 
     wait4(pid, &status, 0, &usage); 
     printf ("CPU time: %ld.%06ld sec user, %ld.%06ld sec system\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec, usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 
    } 
    else 
    { 
     perror("Fork error"); 
     _exit(2); 
    } 
} 

Дело в том, даже когда я прохожу sleep 10 в **arg и родительский процесс ждет ребенка до конца, то он по-прежнему показывает 0,000000 как в системе и пользователю процессорного времени.

Что я делаю неправильно? Благодарим вас за помощь.

ответ

1

Это потому, что время, потраченное дочерним процессом, либо в пространстве пользователя, либо в пространстве ядра. sleep просто приостанавливает вызывающий процесс и вообще не приводит к использованию ЦП.

Вместо этого сделайте так, чтобы ваш ребенок обработал что-то, и вы увидите время процессора.

Например, есть скрипт, названный myscript с:

#!/bin/bash 

for((i=0;i<1000000;i++)); do 
    echo hi >/dev/null 
done 

и выполнить его, как ребенок предпос который покажет некоторые использование процессора.

 Смежные вопросы

  • Нет связанных вопросов^_^