Структура timeval
была описана в разделе 8.7. "Функция gettimeofday()
: системные часы"
В листинге 8.11 показано, как с помощью функции setitimer()
отслеживать выполнение программы. Таймер настроен на интервал 250 мс, по истечении которого генерируется сигнал SIGVTALRM
.
Листинг 8.11. ( itimer.c ) Пример создания таймера
#include
#include
#include
#include
void timer_handler(int signum) {
static int count = 0;
printf("timer expired %d times\n", ++count);
}
int main() {
struct sigaction sa;
struct itimerval timer;
/* Назначение функции timer_handler обработчиком сигнала
SIGVTALRM. */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = &timer_handler;
sigaction(SIGVTALRM, &sa, NULL);
/* Таймер сработает через 250 миллисекунд... */
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 250000;
/* ... и будет продолжать активизироваться каждые 250
миллисекунд. */
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 250000;
/* Запуск виртуального таймера. Он подсчитывает фактическое
время работы процесса. */
setitimer(ITIMER_VIRTUAL, &timer, NULL);
/* Переход в бесконечный цикл. */
while (1);
}
8.14. Функция sysinfo(): получение системной статистики
Функция sysinfo()
возвращает системную статистике. Ее единственным аргументом является указатель на структуру типа sysinfo
. Перечислим наиболее интересные поля этой структуры.
■ uptime
— время в секундах, прошедшее с момента загрузки системы;
■ totalram
— общий объем оперативной памяти;
■ freeram
— свободный объем ОЗУ;
■ procs
— число процессов, работающих в системе.
Для использования функции sysinfo()
требуется включить в программу файлы , и .
Программа, приведенная в листинге 8.12, отображает статистическую информацию о текущем состоянии системы.
Листинг 8.12. ( sysinfo.c ) Вывод системной статистики
#include
#include
#include
#include
int main() {
/* Константы преобразования. */
const long minute = 60;
const long hour = minute * 60;
const long day = hour * 24;
const double megabyte = 1024 * 1024;
/* Получение системной статистики. */
struct sysinfo si;
sysinfo(&si);
/* Представление информации в понятном виде. */
printf("system uptime : %ld days, %ld:%02ld:%021d\n",
si.uptime / day, (si.uptime % day) / hour,
(si.uptime % hour) / minute, si.uptime % minute);
printf("total RAM : %5.1f MB\n", si.totalram / megabyte);
printf("free RAM : %5.1f MB\n",
si.freeram / megabyte);
printf("process count : %d\n", si.procs);
return 0;
}
Функция uname()
возвращает информацию о системе, в частности сетевое и доменное имена компьютера, а также версию операционной системы. Единственным аргументом функции является указатель на структуру типа utsname
. Функция заполняет следующие поля этой структуры (все эти поля содержат текстовые строки).
■ sysname
. Здесь содержится имя операционной системы (например, Linux
).
■ release
, version
. В этих полях указываются номера версии и модификации ядра.
■ machine
. Здесь приводится информация о платформе, на которой работает система. В случае Intel-совместимых компьютеров это будет либо i386
, либо i686
, в зависимости от процессора.
■ node
. Это имя компьютера.
■ __domain
. Это имя домена.
Функция uname()
объявлена в файле .
В листинге 8.13 показана небольшая программа, которая отображает номера версии и модификации ядра Linux, а также сообщает тип платформы.
Листинг 8.15. ( print-uname.c ) Вывод информации о ядре и платформе
#include
#include
int main() {
struct utsname u;
uname(&u);
printf("%s release %s (version %s) on %s\n", u.sysname,
u.release, u.version, u.machine);
return 0;
}
Глава 9
Встроенный ассемблерный код
Сегодня лишь немногие программисты используют в своей практике язык ассемблера. Языки высокого уровня, такие как С и C++, поддерживаются практически на всех архитектурах и обеспечивают достаточно высокую производительность программ. Для тех редких случаев, когда требуется встроить в программу ассемблерные инструкции, в коллекции GNU-компиляторов (GCC) предусмотрены специальные средства, учитывающие особенности конкретной архитектуры.
Встроенными ассемблерными инструкциями следует пользоваться осторожно, так как они являются системно-зависимыми. Например, программу с инструкциями архитектуры x86 не удастся скомпилировать на компьютерах PowerPC. В то же время такие инструкции позволяют напрямую обращаться к аппаратным устройствам, вследствие чего программный код выполняется чуть быстрее.
Читать дальше