Читаем Linux программирование в примерах полностью

<p>14.3.3. Интервальные таймеры: <code>setitimer()</code> и <code>getitimer()</code></p>

Функция alarm() (см. раздел 10.8.1 «Сигнальные часы: sleep(), alarm() и SIGALRM») организует отправку сигнала SIGALRM после истечения данного числа секунд. Ее предельным разрешением является одна секунда. Здесь также BSD 4.2 ввело функцию и три различных таймера, которые используют время в долях секунды.

Интервальный таймер подобен многократно использующимся сигнальным часам. Вы устанавливаете начальное время, когда он должен «сработать», а также как часто это должно впоследствии повторяться. Оба этих значения используют объекты struct timeval; т.е. они (потенциально) имеют разрешение в микросекундах. Таймер «срабатывает», доставляя сигнал; таким образом, нужно установить для таймера обработчик сигнала, желательно до установки самого таймера.

Существуют три различных таймера, описанных в табл. 14.2.

Таблица 14.2. Интервальные таймеры

ТаймерСигналФункция
ITIMER_REALSIGALRMРаботает в реальном режиме
ITIMER_VIRTUALSIGVTALRMРаботает, когда процесс выполняется в режиме пользователя
ITIMER_PROFSIGPROFРаботает, когда процесс выполняется в режиме пользователя или ядра.

Использование первого таймера, ITIMER_REAL, просто. Таймер работает в реальном времени, посылая SIGALRM по истечении заданного количества времени. (Поскольку посылается SIGALRM, нельзя смешивать вызовы setitimer() с вызовами alarm(), а смешивание их с вызовом sleep() также опасно; см. раздел 10.8.1 «Сигнальные часы, sleep(), alarm() и SIGALRM».)

Второй таймер, ITIMER_VIRTUAL, также довольно прост. Он действует, когда процесс исполняется, но лишь при выполнении кода пользователя (приложения) Если процесс заблокирован во время ввода/вывода, например, на диск, или, еще важнее, на терминал, таймер приостанавливается.

Третий таймер, ITIMER_PROF, более специализированный. Он действует все время, пока выполняется процесс, даже если операционная система делает что-нибудь для процесса (вроде ввода/вывода). В соответствии со стандартом POSIX, он «предназначен для использования интерпретаторами при статистическом профилировании выполнения интерпретируемых программ». Установив как для ITIMER_VIRTUAL, так и для ITIMER_PROF идентичные интервалы и сравнивая разницу времени срабатывания двух таймеров, интерпретатор может узнать, сколько времени проводится в системных вызовах для выполняющейся интерпретируемой программы[158]. (Как сказано, это довольно специализировано.) Двумя системными вызовами являются:

#include /* XSI */

int getitimer(int which, struct itimerval *value);

int setitimer(int which, const struct itimerval *value,

 struct itimerval *ovalue);

Аргумент which является одной из перечисленных ранее именованных констант, указывающих таймер, getitimer() заполняет struct itimerval, на которую указывает value, текущими установками данного таймера, setitimer() устанавливает для данного таймера значение в value. Если имеется ovalue, функция заполняет ее текущим значением таймера. Используйте для ovalue NULL, если не хотите беспокоиться о текущем значении. Обе функции возвращают в случае успеха 0 и -1 при ошибке, struct itimerval состоит из двух членов struct timeval:

struct itimerval {

 struct timeval it_interval; /* следующее значение */

 struct timeval it_value;    /* текущее значение */

};

Прикладным программам не следует ожидать, что таймеры будут с точностью до микросекунд. Справочная страница getitimer(2) дает следующее объяснение:

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных