
- •1 Цель работы
- •2 Теоретическое введение
- •2.1 Программируемый таймер.
- •2.1.1 Режим 0 - программируемая задержка
- •2.1.2 Режим 1 - программируемый одновибратор
- •2.1.3 Режим 2 - программируемый делитель (генератор) частоты
- •2.1.4 Режим 3 - программируемый генератор меандра
- •2.1.5 Режим 4 - генератор одиночного импульса (счетчик событий)
- •2.1.6 Режим 5 - генератор одиночного импульса (счетчик событий) с аппаратным перезапуском
- •2.2 Обработка прерываний.
- •2.2.1 Определение сигнала
- •2.2.2 Имена сигналов
- •2.2.3 Нормальное и аварийное завершение программ
- •2.2.4 Обработка сигналов
- •2.2.5 Генерация сигнала
- •2.2.6 Передача сигналов самому процессу: вызовы raise и alarm
- •2.2.7 Приостановка работы программы. Системный вызов pause
- •Задание на курсовую работу
- •Требование к оформлению курсовой работы
- •5 Теоретические вопросы
2.2.5 Генерация сигнала
Обратную операцию, посылку сигнала, выполняет системный вызов kill, описанный следующим образом:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
Первый параметр pid определяет процесс или процессы, которым посылается сигнал sig. Обычно pid является положительным числом, и в этом случае он рассматривается как идентификатор процесса. Поэтому следующий оператор
kill (7421, SIGTERM);
означает <послать сигнал SIGTERM процессу с идентификатором 7421>.
Так как процесс, посылающий сигнал kill, должен знать идентификатор процесса, которому предназначен сигнал, то вызов kill чаще всего используется для обмена между тесно связанными процессами, например, родительским и дочерним. Заметим, что процесс может послать сигнал самому себе.
Существуют некоторые ограничения, связанные с правами доступа. Чтобы можно было послать сигнал процессу, идентификатор пользователя посылающего процесса должен совпадать с идентификатором пользователя процесса, которому сигнал адресован.
Чтобы определить идентификатор текущего процесса используется вызов getpid:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid (void);
2.2.6 Передача сигналов самому процессу: вызовы raise и alarm
Функция raise просто посылает сигнал выполняющемуся процессу:
#include <signal.h>
int raise(int sig);
Вызывающему процессу посылается сигнал, определенный параметром sig, и в случае успеха функция raise возвращает нулевое значение.
Вызов alarm - это вызов, который устанавливает таймер процесса. При срабатывании таймера процессу посылается сигнал SIGALRM.
#include <unistd.h>
unsigned int alarm(unsigned int secs);
Переменная secs задает время в секундах, на которое устанавливается таймер. После истечения заданного интервала времени процессу посылается сигнал SIGALRM, Поэтому вызов
alarm(60) ;
приводит к посылке сигнала SIGALRM через 60 секунд. Обратите внимание, что вызов alarm не приостанавливает выполнение процесса, как вызов sleep, вместо этого сразу же происходит возврат из вызова alarm, и продолжается нормальное выполнение процесса, по крайней мере, до тех пор, пока не будет получен сигнал SIGALRM- Выключить таймер можно при помощи вызова alarm с нулевым параметром:
alarm(0);
Вызовы alarm не накапливаются: другими словами, если вызвать alarm дважды, то второй вызов отменит предыдущий. Но при этом возвращаемое вызовом alarm значение будет равно времени, оставшемуся до срабатывания предыдущего таймера, и его можно при необходимости записать,
2.2.7 Приостановка работы программы. Системный вызов pause
ОС UNIX также содержит дополняющий вызов alarm системный вызов pause, который определен следующим образом:
#include <unistd.h>
int pause(void);
Вызов pause приостанавливает выполнение вызывающего процесса (так что процесс при этом не занимает процессорного времени) до получения любого сигнала, например, сигнала SIGALRM. Если сигнал вызывает нормальное завершение процесса или игнорируется процессом, то в результате вызова pause будет просто выполнено соответствующее действие (завершение работы или игнорирование сигнала). Если же сигнал перехватывается, то после завершения соответствующего обработчика прерывания вызов pause вернет значение -1 и поместит в переменную errno значение EINTR.