Когда вы используете такую команду, как time (1) , она должна использовать системный вызов, такой как getrusage (2) через свою оболочку системной библиотеки, Это создает запрос с правильным номером системного вызова и структурой, указывающей, что он хочет получить информацию об использовании для дочерних процессов.
Для совместимости между операционными системами UNIX / POSIX, которая задает c функции, выбранные для построения команды, выполняются из иерархии параметров, чтобы адекватно охватывать операционные системы, на которых выполняется команда. (Некоторые операционные системы могут не реализовывать все или иметь разные причуды.)
В случае time предпочтет группировать ожидания ребенка и использовать его для вызова wait3 который, в свою очередь, реализован как оболочка для еще более сложного wait4, который имеет свой собственный номер системного вызова .
И wait3 / 4, и getrusage заполняют одну и ту же структуру rusage информацией, и с тех пор time только напрямую вызывает один дочерний процесс, вызывая wait3()
, как он это делает, или разбивая его на менее функциональные вызовы, такие как wait();getrusage(RUSAGE_CHILDREN)
, по сути то же самое. Следовательно, время эффективно отображает те же данные, которые предоставляет getrusage (вместе с некоторыми более общими данными, которые он собирает из системы, например, в реальном времени, используя вызовы gettimeofday
).
Реальные Разница между функциями-обертками systemcall заключается в следующем:
- У getrusage есть еще один аргумент, позволяющий процессу самому взглянуть на себя.
- wait4 может быть нацелен только на одного прямого потомка и потомков этого потомка. 1033 *
- wait3 - это упрощение или wait4, или использования
wait();getrusage()
, которое не так универсально, как и то, но просто достаточно для команды time (1), как она реализована. (Следовательно, wait3 - это самый простой и безопасный вариант использования времени в операционных системах, где он доступен.)
Чтобы убедиться, что они совпадают, можно изменить time
на альтернативную версию, перекомпилировать и сравнить:
while ((caught = wait3 (&status, 0, NULL)) != pid)
{
if (caught == -1) {
getrusage(RUSAGE_CHILDREN, &resp->ru);
return 0;
}
}