Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа ИС-09New.docx
Скачиваний:
5
Добавлен:
11.12.2018
Размер:
168.44 Кб
Скачать

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.