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

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

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

На 64-разрядных платформах переменная

time_t
является соответственно 64-битовым числом со знаком. Это действительно эффективное решение, поскольку 64-битовое время со знаком можно назвать астрономическим.

Для того чтобы определить начальное время, текущее время, конечное время для используемой системы можно создать и запустить данную программу

daytime.с
.

 1: /* daytime.с */

 2:

 3: #include <stdio.h>

 4: #include <sys/time.h>

 5: #include <unistd.h>

 6:

 7: int main {

 8: struct timeval tv;

 9: struct timezone tz;

10: time_t now;

11: /* beginning_of_time —
это наименьшее значении, измеряемое time_t*/

12: time_t beginning_of_time = 1L<<(sizeof(time_t)*8 - 1);

13: /* end_of_time - это наибольшее значение, измеряемое time_t */

14: time_t end_of_time = ~beginning_of_time;

15:

16: printf("time_t имеет %d бит в длину\n\n", sizeof(time_t) *8);

17:

18: gettimeofday(&tv, &tz);

19: now = tv.tv_sec;

20: printf("Текущее время дня, представленное в виде структуры timeval:\n"

21: "tv.tv_sec = 0x%08x, tv.tv_usec = 0x%08х\n"

22: "tz.tz_minuteswest = 0x%08х, tz.tz_dsttime = 0x%08x\n\n",

23: tv.tv_sec, tv.tv_usec, tz.tz_minuteswest, tz.tz_dsttime);

24:

25: printf("Демонстрация ctime%s:\n",

26: sizeof(time_t)*8 <= 32 ? "" :

27: " (может зависнуть после печати первой строки; нажмите "

28: "Control-C)") ;

29: printf("текущее время: %s", ctime(&now));

30: printf("начало времени: %s", ctime(&beginning_of_time));

31: printf("конец времени: %s", ctime(&end_of_time));

32:

33: exit(0);

34: }

К сожалению, функция

ctime
является итеративной по своей природе. Это означает, что она (при любых практических целях) никогда не прерывает свою работу в 64-разрядных системах даже для астрономических дат (вроде 64-битового времени начала и завершения). Если вы устали ждать, когда же программа завершит свою работу, нажмите Control-C для ее завершения.

18.2. Использование таймеров

Таймер — это простое средство для указаний определенной точки в будущем, в которой должно произойти некоторое событие. Вместо того чтобы циклически запрашивать текущее время и проводить лишние растраты циклов центрального процессора, программа может отправить в ядро запрос на получение уведомления о том, что прошло определенное количество времени.

Существуют два способа применения таймеров: синхронный и асинхронный. Синхронное использование таймера возможно в единственном режиме — режиме ожидания (дожидаться истечения времени таймера). Асинхронная работа таймера, как и любого другого асинхронного устройства, сопровождается сигналами. Сюрпризом может оказаться то, что синхронный таймер может также вызывать сигналы.

18.2.1. Режим ожидания

Процесс, сопровождающийся запросом

на невыполнение в течение определенного количества времени, называется отложенным (или "спящим"). Для режима ожидания доступны четыре функции; каждая из них измеряет время в различных единицах. Они также ведут себя и взаимодействуют с остальными частями системы по-разному.

unsigned int sleep(unsigned int seconds);

Функция

sleep
вынуждает текущий процесс засыпать на время (в секундах), указанное параметром
seconds
, или до тех пор, пока процесс не получит сигнал, который он не может проигнорировать. На большинстве платформ функция
sleep
реализуется в терминах сигнала
SIGALRM
, поэтому она не очень хорошо совмещается с системным вызовом
alarm
, созданием обработчика
SIGALRM
, игнорированием сигнала
SIGALRM
, или применением интервальных таймеров (рассматриваются далее), которые разделяют один и тот же таймер и сигнал.

Если работа

sleep
завершается раньше истечения полного выделенного времени, она возвращает количество оставшихся секунд. Если режим ожидания длился ровно столько, сколько запрашивалось, она возвращает ноль.

void usleep(unsigned long usec);

Функция

usleep
вынуждает текущий процесс засыпать на время (в микросекундах), указанное параметром
usec
. Никакие сигналы не используются. На большинстве платформ
usleep
реализуется с помощью
select
.

int select(0, NULL, NULL, NULL, struct timeval tv);

Функция

select
, описанная в главе 13, предлагает мобильный способ откладывания процессов на точное количество времени. Просто введите в объект
struct timeval
минимальное время, которое нужно ожидать, и можете быть уверены — ни одно событие не произойдет.

int nanosleep(struct timespec *req, struct timespec *rem);

Функция

nanosleep
вынуждает текущий процесс засыпать на время, указанное параметром
req
(описание объекта
timespec
можно найти в начале этой главы), пока процесс не получит сигнал. Если работа
nanosleep
прекращается раньше из-за полученного сигнала, то она возвращает
– 1
и устанавливает для
errno
значение
EINTR
, а также, если
rem
не является
NULL
, то передает в переменную
rem
количество времени, оставшегося в периоде ожидания.

Функция

nanosleep
наименее переносима из всех рассмотренных, поскольку она была определена как часть спецификации POSIX.1b реального времени (ранее она называлась POSIX.4), которая выполняется не во всех версиях Unix. Однако все новые реализации Unix поддерживают ее, так как функции POSIX.1b в настоящее время являются стандартной частью Single Unix Specification (Единая спецификация Unix).

Не все платформы, предусматривающие функцию

nanosleep
, обеспечивают высокую точность, однако Linux, как и остальные операционные системы реального времени, стремится принимать короткие запросы на обработку с предельной точностью. Более подробную информацию о программировании в режиме реального времени можно найти в [12].

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

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Эйгор. В потёмках

Кронос Александр
1. Эйгор
Фантастика:
боевая фантастика
7.00
рейтинг книги
Эйгор. В потёмках

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Все еще не Герой!. Том 2

Довыдовский Кирилл Сергеевич
2. Путешествие Героя
Фантастика:
боевая фантастика
юмористическое фэнтези
городское фэнтези
рпг
5.00
рейтинг книги
Все еще не Герой!. Том 2

Восьмое правило дворянина

Герда Александр
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восьмое правило дворянина

70 Рублей

Кожевников Павел
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
70 Рублей

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска

Штурм Земли

Семенов Павел
8. Пробуждение Системы
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Штурм Земли

Камень. Книга пятая

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