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
и выполнить его как дочерний процесс, который покажет использование процессора.