Rusage с 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

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

Другие вопросы по тегам