Чтение онлайн

на главную - закладки

Жанры

Программирование для 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);

Поделиться:
Популярные книги

Путь

Yagger Егор
Фантастика:
космическая фантастика
4.25
рейтинг книги
Путь

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

Прапорщик. Назад в СССР. Книга 6

Гаусс Максим
6. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 6

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Пересмешник

Пехов Алексей Юрьевич
Фантастика:
фэнтези
9.38
рейтинг книги
Пересмешник

Тьма чернее ночи

Коннелли Майкл
7. Гарри Босх
Детективы:
триллеры
7.64
рейтинг книги
Тьма чернее ночи

Последний Паладин. Том 12

Саваровский Роман
12. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 12

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Меткий стрелок

Вязовский Алексей
1. Меткий стрелок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Меткий стрелок

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Эпоха Опустошителя. Том VIII

Павлов Вел
8. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VIII

Я до сих пор князь. Книга XXII

Дрейк Сириус
22. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор князь. Книга XXII

Государь

Кулаков Алексей Иванович
3. Рюрикова кровь
Фантастика:
мистика
альтернативная история
историческое фэнтези
6.25
рейтинг книги
Государь

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4