Существует несколько системных функций, имеющих отношение к времени протекания процесса: stime, time, times и alarm. Первые две имеют дело с глобальным системным временем, последние две - с временем выполнения отдельных процессов.
Функция stime дает суперпользователю возможность заносить в глобальную переменную значение глобальной переменной. Выбирается время из этой переменной с помощью функции time: time(tloc);
где tloc - указатель на переменную, принадлежащую процессу, в которую заносится возвращаемое функцией значение. Функция возвращает это значение и из самой себя, например, команде date, которая вызывает эту функцию, чтобы определить текущее время.
Функция times возвращает суммарное время выполнения процесса и всех его потомков, прекративших существование, в режимах ядра и задачи. Синтаксис вызова функции: times(tbuffer) struct tms *tbuffer;
где tms - имя структуры, в которую помещаются возвращаемые значения и которая описывается следующим образом: struct tms { /* time_t - имя структуры данных, в которой хранится время */ time_t tms_utime; /* время выполнения процесса в режиме задачи */ time_t tms_stime; /* время выполнения процесса в режиме ядра */ time_t tms_cutime; /* время выполнения потомков в режиме задачи */ time_t tms_cstime; /* время выполнения потомков в режиме ядра */ };
Функция times возвращает время, прошедшее "с некоторого произвольного момента в прошлом", как правило, с момента загрузки системы.
#include <sys/types.h> #include <sys/times.h> extern long times();
main() { int i; /* tms - имя структуры данных, состоящей из 4 элемен- тов */ struct tms pb1,pb2; long pt1,pt2; pt1 = times(&pb1); for (i = 0; i < 10; i++) if (fork() == 0) child(i); for (i = 0; i < 10; i++) wait((int*) 0); pt2 = times(&pb2); printf("процесс-родитель: реальное время %u в режиме задачи %u в режиме ядра %u потомки: в режиме задачи %u в режиме ядра %u\n", pt2 - pt1,pb2.tms_utime - pb1.tms_utime, pb2.tms_stime - pb1.tms_stime, pb2.tms_cutime - pb1.tms_cutime, pb2.tms_cstime - pb1.tms_cstime); } child(n); int n; { int i; struct tms cb1,cb2; long t1,t2; t1 = times(&cb1); for (i = 0; i < 10000; i++) ; t2 = times(&cb2); printf("потомок %d: реальное время %u в режиме задачи %u в режиме ядра %u\n",n,t2 - t1, cb2.tms_utime - cb1.tms_utime, cb2.tms_stime - cb1.tms_stime); exit(); } |