Операционная система UNIX. Руководство программиста

       

Сигналы и прерывания


Термины сигнал и прерывание в контексте ОС UNIX являются синонимами: оба означают сообщения, посылаемые операционной системой выполняющимся процессам. Как правило, результатом получения сигнала является прекращение выполнения процесса. Некоторые сигналы генерируются, если процесс пытается выполнить недопустимые действия; другие сигналы могут инициироваться обычным пользователем для своих собственных процессов, или суперпользователем для всех процессов.

Чтобы послать сигнал из одного процесса другому, также имеющему Ваш идентификатор пользователя, можно воспользоваться системным вызовом kill(2). Он имеет следующий формат:

int kill (pid, sig) int pid, sig;

где pid - это идентификатор процесса, которому посылается сигнал, а sig - целое число от 1 до 19, обозначающее посылаемый сигнал. Название kill является некоторым преувеличением - далеко не все сигналы смертельны. Ниже приведены некоторые сигналы, определенные во включаемом файле <sys/signal.h>.

#define SIGHUP 1 /* Освобождение линии */ #define SIGINT 2 /* Прерывание */ #define SIGQUIT 3 /* Выход */ #define SIGILL 4 /* Некорректная команда. Не пере- устанавливается при перехвате */ #define SIGTRAP 5 /* Трассировочное прерывание. Не пере- устанавливается при перехвате */ #define SIGIOT 6 /* Машинная команда IOT */ #define SIGABRT 6 /* Рекомендуемый синоним предыдущего */ #define SIGEMT 7 /* Машинная команда EMT */ #define SIGFPE 8 /* Исключительная ситуация при выполнении операции с вещественными числами */ #define SIGKILL 9 /* Уничтожение процесса. Не перехватывается и не игнорируется */ #define SIGBUS 10 /* Ошибка шины */ #define SIGSEGV 11 /* Некорректное обращение к сегменту памяти */ #define SIGSYS 12 /* Некорректный параметр системного вызова */ #define SIGPIPE 13 /* Запись в канал, из которого некому читать */ #define SIGALRM 14 /* Будильник */ #define SIGTERM 15 /* Программный сигнал завершения */ #define SIGUSR1 16 /* Определяемый пользователем сигнал 1 */ #define SIGUSR2 17 /* Определяемый пользователем сигнал 2 */ #define SIGCLD 18 /* Завершение порожденного процесса */ #define SIGPWR 19 /* Ошибка питания */


/* Сигналы SIGWIND и SIGPHONE используются только в UNIX/PC */ /*#define SIGWIND 20 */ /* Изменение окна */ /*#define SIGPHONE 21*/ /* Изменение строки состояния */

#define SIGPOLL 22 /* Регистрация выборочного события */

#define NSIG 23 /* Максимально допустимый номер сигнала. Сигналы могут иметь номера от 1 до NSIG-1 */ #define MAXSIG 32 /* Размер u_signal[], NSIG-1<=MAXSIG. MAXSIG больше, чем сейчас необходимо. В будущем, возможно, будут добавлены новые сигналы, при этом не придется менять user.h */

С помощью системного вызова signal(2) можно выбрать один из трех возможных способов реакции на получаемые сигналы. Имеется возможность:


  • Установить стандартную реакцию на сигнал.
  • Игнорировать сигнал.
  • Задать собственную функцию для обработки сигнала.





Содержание раздела