| Назад |
Для взаимодействия процессов между собой и ядром, в системе UNIX существуют сигналы. Посылаются они в следующих случаях, перечисленных ниже.
Когда программа получает сигнал, вызывается либо функция, зарегистрированная как реакция на него, либо выполняется стандартное действие ОС. Большинство нетривиальных программ в системе UNIX используют сигналы. Каждый сигнал имеет целочисленный идентификатор. Некоторые сигналы являются стандартными. Их идентификаторам соответствуют символические константы, определенные в файле-заголовке <signal.h>.
Количество стандартных сигналов зависит от версии системы. Ниже приведен перечень, используемый в большинстве диалектов ОС.
| SIGABRT | Сигнал генерируется вызовом функции abort( ) и вызывает аварийное завершение процесса. |
| SIGALARM | Сигнал посылается по истечении времени, установленного функцией alarm( ). |
| SIGBUS | Сигнал возникает при сбое оборудования. |
| SIGCONT | Сигнал позволяет возобновить выполнение процесса, прерванного по сигналу SIGSTOP. |
| SIGFPE | Ошибка при выполнении арифметической операции с действительными числами. |
| SIGILL | Неверная инструкция процессора при выполнении программы. |
| SIGINT | Сигнал возникает при вводе с терминала <Ctrl+С>. |
| SIGIO | Завершение асинхронной операции ввода-вывода. |
| SIGIOT | Ошибочное завершение асинхронной операции ввода-вывода. |
| SIGKILL | Немедленно завершить процесс. |
| SIGPIPE | Ошибки при записи в канал межпроцессного ввода-вывода (pipe) (см. 1.7.2.). |
| SIGSEGV | Ошибка при использовании процессом неверного адреса. |
| SIGSTOP | Приостановить выполнение процесса. |
| SIGSYS | Ошибка при выполнении системного вызова. |
| SIGTERM | Завершить процесс. |
| SIGTRAP | Аппаратная ошибка при выполнении процесса. |
| SIGTSTP | Ввод с клавиатуры <Ctrl+Z> (приостановить процесс). |
Программа, получив сигнал, может обработать его одним из трех способов.
Для задания способа обработки сигнала используется системный вызов signal( ):
#include <signal.h> int (*signal (int sig, void (*func) (int))) (int);
Первый аргумент представляет собой идентификатор сигнала, а второй - адрес функции, производящей обработку. При задании второго аргумента могут быть использованы два специальных значения: SIG_IGN - игнорировать сигнал и SIG_DFL - обработать сигнал стандартным способом. Функция всегда возвращает адрес предыдущей функции обработки сигнала.
Приведен пример работы с сигналами.
#include <stdio.h>
#include <signal.h>
void SignalCtrlC (int sig_no) {
printf ("Receive signal : %d\n", sig_no);
signal (SIGINT, SignalCtrlC);
};
void main (int argc, char *argv []) {
char c = 0;
signal (SIGINT, SignalCtrlC);
while (c!='q')
c = getchar( );
}
Программа заказывает реакцию на нажатие комбинации <Ctrl+C> (SIGINT). После чего ожидается ввод с терминала символа 'q'. Когда он приходит, процесс завершается. Функция SignalCtrlC( ) реагирует на сигнал SIGINT, просто печатая соответствующее сообщение.