Книга: Программирование для Linux. Профессиональный подход

Листинг 8.8. (better_sleep.c) Высокоточная реализация функции sleep()

Листинг 8.8. (better_sleep.c) Высокоточная реализация функции sleep()

#include <errno.h>
#include <time.h>
int better_sleep(double sleep_time) {
 struct timespec tv;
 /* Заполнение структуры timespec на основании указанного числа
    секунд. */
 tv.tv_sec = (time_t)sleep_time;
 /* добавление неучтенных выше наносекунд. */
 tv.tv_nsec = (long)((sleep_time - tv.tv_sec) * 1e+9);
 while (1) {
  /* Пауза, длительность которой указана в переменной tv.
     В случае прерывания по сигналу величина оставшегося
     промежутка времени заносится обратно в переменную tv. */
  int rval = nanosleep(&tv, &tv);
  if (rval == 0)
   /* пауза успешно окончена. */
   return 0;
  else if (errno == EINTR)
   /* Прерывание по сигналу. Повторная попытка. */
   continue;
  else
   /* Какая-то другая ошибка. */
   return rval;
 }
 return 0;
}

Оглавление книги


Генерация: 1.549. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз