Каждый из этих таймеров генерирует ассоциированный сигнал об истечении таймера в пределах одного хода системных часов (как правило, 1-10 миллисекунд). Если процесс работает в данное время, то сигнал генерируется сразу же; в противном случае сигнал генерируется немного позже (в зависимости от загрузки системы). Поскольку таймер ITIMER_VIRTUAL
следит за временем только во время работы процесса, то сигнал всегда доставляется незамедлительно.
Используйте структуру struct itimerval
для передачи запроса и установки интервальных таймеров.
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
Член it_value
показывает количество времени, оставшееся до отправления следующего сигнала. Член it_interval
определяет время между сигналами; каждый раз при истечении таймера это значение присваивается переменной it_value
.
Для взаимодействия с интервальными таймерами предусмотрены два системных вызова. Оба принимают аргумент which
, указывающий обрабатываемый таймер.
int getitimer(int which, struct itimerval *val);
Переменной val
присваивается текущее состояние таймера which
.
int setitimer(int which, struct itimerval *new, struct itimerval *old);
Устанавливает таймер which
на значение new и заменяет old
предыдущей установкой, если она не равна NULL
.
Если параметр таймера it_value
приравнять к нулю, он немедленно заблокируется. Ввод нулевого значения для it_interval
отключает таймер после следующего запуска.
В следующем примере родительский процесс активизирует дочерний процесс, запускает односекундный таймер ITIMER_REAL
, засыпает на 10 секунд, а затем уничтожает дочерний процесс.
1: /* itimer.c */
2:
3: #include
4: #include
5: #include
6: #include
7: #include
8: #include
9: #include
10:
11:
12: void catch_signal(int ignored) {
13: static int iteration=0;
14:
15: printf("получен сигнал интервального таймера, итерация %d\n",
16: iteration++);
17: }
18:
19: pid_t start_timer(int interval) {
20: pid_t child;
21: struct itimerval it;
22: struct sigaction sa;
23:
24: if (!(child = fork())) {
25: memset(&sa, 0, sizeof(sa));
26: sa.sa_handler = catch_signal;
27: sigemptyset(&sa.sa_mask);
28: sa.sa_flags = SA_RESTART;
29:
30: sigaction(SIGALRM, &sa, NULL);
31:
32: memset(&it, 0, sizeof(it));
33: it.it_interval.tv_sec = interval;
34: it.it_value.tv_sec = interval;
35: setitimer(ITIMER_REAL, &it, NULL);
36:
37: while (1) pause();
38: }
39:
40: return child;
41: }
42:
43: void stop_timer(pid_t child) {
44: kill(child, SIGTERM);
45: }
46:
47: int main (int argc, const char **argv) {
48: pid_t timer = 0;
49:
50: printf("Демонстрация интервальных таймеров для 10 секунд, "
51: "ожидайте...\n");
52: timer = start_timer(1);
53: sleep(10);
54: stop_timer(timer);
55: printf("Готово.\n");
56:
57: return 0;
58: }
Слово случайный имеет разный смысл для разных программистов в различное время. Для большинства приложений оказываются достаточно эффективными псевдослучайные числа, предусмотренные библиотекой С. Благодаря тому, что псевдослучайные числа позволяют воспроизводить первоначальные условия, если это необходимо (например, с целью отладки), они оказываются предпочтительнее действительно случайных чисел.
Однако некоторые приложения (включая криптографические) для достижения наилучших результатов требуют использования действительно случайных чисел. Ядро Linux для предоставления криптографически устойчивых случайных чисел производит выборку событий из непредсказуемого внешнего мира.
Все компьютеры поддаются прогнозированию. В большинстве задач, которые мы поручаем компьютеру, предсказуемость является наиболее важным обстоятельством. Даже если в вашей программе появляются ошибки, необходимо, чтобы их возникновение было предсказуемым, иначе вы не сможете найти их и ликвидировать.
19.1. Псевдослучайные числа
В некоторых ситуациях все же требуется обеспечить невозможность прогнозирования. Библиотека С содержит функции для генерирования ожидаемых последовательностей псевдослучайных чисел. Эти функции легки в применении и являются одинаковыми на всех платформах Unix. Рассмотрим пример типичного использования данных функций.
#include
Читать дальше