Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
К.Р. Вариант 2.docx
Скачиваний:
2
Добавлен:
24.09.2019
Размер:
32.12 Кб
Скачать

Вариант 2 Сигналы. Посылка сигнала процессу из командной строки и программным путем. Критические секции.

Сигналы инициируются некоторыми событиями в системе и посылаются процессу для уведомления его о том, что произошло нечто неординарное, требующее определённой реакции. Событие, порождающее сигнал, может быть действием пользователя, или вызываться другим процессом, или ядром операционной системы. Сигналы являются одним из самых старых и традиционных механизмов UNIX.

Уже из этого краткого описания можно заключить, что:

· действия, вызываемые для обработки сигнала, являются принципиально асинхронными;

· сигналы могут быть использованы как простейшее, но мощное средство межпроцессорного взаимодействия;

Все сигналы определяются целочисленными константами, но это принципиально не важно для программиста, т. к. каждому сигналу приписано символическое наименование вида SIG* (все определения, относящиеся к сигналам находятся в заголовочном файле <signal.h>, этот заголовочный файл должен быть включён в любой код, работающий с сигналами, в последующих примерах мы не будем показывать эту включающую директиву, чтобы не загромождать текст).

Вот некоторые из них:

SIGKILL (+) [9] – уничтожение процесса (kill), этот сигнал может активироваться командой: kill -9 <PID>. Это сигнал безусловного завершения, посылаемый процессу другим процессом или системой (при завершении работы системы). Этот сигнал не может быть проигнорирован или перехвачен.

SIGSTOP [23] – временная остановка процесса (sendable stop signal not from tty). Если пользователь вводит с терминала [Ctrl+Z], то активному процессу посылается этот сигнал, и процесс приостанавливается. Позже процесс может быть возобновлён с точки останова при получении сигнала SIGCONT. Этот сигнал нельзя проигнорировать или перехватить.

SIGTERM [15] – программный сигнал завершения (software termination signal from kill). Программист может использовать этот сигнал для того, чтобы дать процессу время для “наведения порядка”, прежде чем посылать ему сигнал SIGKILL. Именно этот сигнал посылается по умолчанию командой kill без параметра, указывающего сигнал.

SIGALRM [14] – наступление тайм-аута таймера сигналов (real-time alarm clock). Посылается при срабатывании ранее установленного пользовательского таймера (таймер устанавливается заданием первого параметра setitimer() равным ITIMER_REAL), например при помощи системного вызова alarm().

SIGSEGV (+) [11] – обращение к некорректному адресу памяти, ошибка защиты памяти, нарушение границ сегмента памяти (invalid memory reference, segmentation violation).

SIGINT (-) [2] – принудительное прерывание процесса (interrupt), это тот сигнал, который генерируется при нажатии [Ctrl+C]. Это обычный способ завершения выполняющегося процесса.

SIGCONT [25] – продолжение работы остановленного процесса (continue executing if stoped). Это сигнал управления выполнением процесса, который возобновляет его выполнение, если ранее он был остановлен сигналом SIGSTOP; в случае, если процесс не остановлен – он игнорирует этот сигнал.

SYSUSR1 [16], SYSUSR2 [17] – зарезервированные сигналы пользователя. Для этих сигналов предопределённой реакцией является “игнорировать”, и реакцию на них должен определять пользователь. Так же, как и сигнал SIGTERM, эти сигналы никогда не посылаются системой.

Все сигналы, кроме SIGSTOP и SIGCONT приводят к завершению процесса.

Пример: см. тетрадь.

Если необходимо остановить процесс во что бы то ни стало, следует использовать сигнал QUIT (quit, обычно ^С), который обычно не перехватывается. Процесс можно приостановить при помощи сигнала STOP (susp, ^Z). Тогда он временно остановится, перестанет быть активным и не будет работать до тех пор, пока не получит сигнал CONT (уже не с клавиатуры, потому что, перестав быть активным, он потеряет к ней доступ; многие командные интерпретаторы имеют команды fg и bg для того, чтобы приостановленный процесс продолжил работать как активный или как фоновый соответственно).

Кстати, отправкой сигналов процессам не с клавиатуры, а программным путем занимается утилита kill. Ей передается обязательный параметр - идентификатор процесса (PID), и необязательный - имя или номер сигнала. По умолчанию kill посылает сигнал TERM, но с ее помощью можно послать самый страшный сигнал, KILL, обрабатывать который никакая программа не вправе.

Function Kill(Pid:Longint; Sig:Integer):Integer;

Первый параметр pid определяет процесс или процессы, которым посылается сигнал sig. Обычно pid является положительным числом, и в этом случае он рассматривается как идентификатор процесса.