Программирование для Linux. Профессиональный подход
Шрифт:
8.13. Функция setitimer: задание интервальных таймеров
Функция
setitimer
является обобщением системного вызова alarm
. Она планирует доставку сигнала по истечении заданного промежутка времени. С помощью функции
setitimer
можно создавать таймеры трех типов. ■
ITIMER_REAL
. По истечении указанного времени процессу посылается сигнал SIGALRM
. ■
ITIMER_VIRTUAL
. После того как процесс отработал требуемое время,
SIGVTALRM
. Время, когда процесс не выполнялся (работало ядро или другой процесс), не учитывается. ■
ITIMER_PROF
. По истечении указанного времени процессу посылается сигнал SIGPROF
. Учитывается время выполнения самого процесса, а также запускаемых в нем системных вызовов. Код таймера задается в первом аргументе функции
setitimer
. Второй аргумент — это указатель на структуру типа itimerval
, содержащую параметры таймера. Третий аргумент либо равен NULL
, либо является указателем на другую структуру itimerval
, куда будут записаны прежние параметры таймера. В структуре
itimerval
два поля. ■
it_value
. Здесь находится структура типа timeval
, где записано время отправки сигнала. Если это поле равно нулю, таймер отменяется. ■
it_interval
. Это еще одна структура timeval
, определяющая, что произойдет после отправки первого сигнала. Если она равна нулю, таймер будет отменен. В противном случае здесь записан интервал генерирования сигналов. Структура
timeval
была описана в разделе 8.7. "Функция gettimeofday
: системные часы" В листинге 8.11 показано, как с помощью функции
setitimer
отслеживать выполнение программы. Таймер настроен на интервал 250 мс, по истечении которого генерируется сигнал SIGVTALRM
. Листинг 8.11. (itimer.c) Пример создания таймера
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
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
требуется включить в программу файлы <linux/kernel.h>
, <linux/sys.h>
и <sys/sysinfo.h>
. Программа, приведенная в листинге 8.12, отображает статистическую информацию о текущем состоянии системы.
Листинг 8.12. (sysinfo.c) Вывод системной статистики
#include <linux/kernel.h>
#include <linux/sys.h>
#include <stdio.h>
#include <sys/sysinfo.h>
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);
Поделиться:
Популярные книги
Измена. Тайный наследник
1. Тайный наследник
Фантастика:
фэнтези
5.00
рейтинг книги
Инквизитор Тьмы
1. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Ротмистр Гордеев 3
3. Ротмистр Гордеев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
(Не)нужная жена дракона
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
Идеальный мир для Лекаря 28
28. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Сыночек в награду. Подари мне любовь
1. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Инквизитор Тьмы 2
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Генерал Скала и ученица
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Искатель 1
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Сердце Дракона. Том 10
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Печать мастера
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Выстрел на Большой Морской
4. Сыщик Его Величества
Детективы:
исторические детективы
полицейские детективы
8.64
рейтинг книги
Кодекс Крови. Книга VII
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00