Существует класс процесса, именуемый потоком (thread), который доступен во многих системах UNIX и Linux. Несмотря на то, что потоки трудно, программировать, они могут быть очень важны для некоторых приложений, таких как многопоточные серверы баз данных. Программирование потоков в Linux (и вообще в UNIX) не так распространено, как применение множественных процессов, поскольку процессы Linux очень легко применять и программирование множественных взаимодействующих процессов гораздо легче программирования потоков. Потоки обсуждаются в главе 12.

<p>Сигналы</p>

Сигнал — это событие, генерируемое системами UNIX и Linux в ответ на некоторую ситуацию, получив сообщение о котором процесс, в свою очередь, может предпринять какое-то действие. Мы применяем термин "возбуждать" (raise) для обозначения генерации сигнала и термин "захватывать" (catch) для обозначения получения или приема сигнала. Сигналы возбуждаются некоторыми ошибочными ситуациями, например нарушениями сегментации памяти, ошибками процессора при выполнении операций с плавающей точкой или некорректными командами. Они генерируются командной оболочкой и обработчиками терминалов для вызова прерываний и могут явно пересылаться от одного процесса к другому как способ передачи информации или коррекции поведения. Во всех этих случаях программный интерфейс один и тот же. Сигналы могут возбуждаться, улавливаться и соответственно обрабатываться или (по крайней мере, некоторые) игнорироваться.

Имена сигналов задаются с помощью включенного заголовочного файла signal.h. Они начинаются с префикса SIG и включают приведенные в табл. 11.3 сигналы.

Таблица 11.3

Имя сигналаОписание
SIGABORT*Процесс аварийно завершается
SIGALRMСигнал тревоги
SIGFPE*Исключение операции с плавающей точкой
SIGHUPНеожиданный останов или разъединение
SIGILL*Некорректная команда
SIGINTПрерывание терминала
SIGKILLУничтожение (не может быть перехвачен или игнорирован)
SIGPIPEЗапись в канал без считывателя
SIGQUITЗавершение работы терминала
SIGSEGV*Некорректный доступ к сегменту памяти
SIGTERMЗавершение, выход
SIGUSR1Сигнал 1, определенный пользователем
SIGUSR2Сигнал 2, определенный пользователем

*Могут быть также предприняты действия, зависящие от конкретной реализации.

Если процесс получает один из этих сигналов без предварительной подготовки к его перехвату, процесс будет немедленно завершен. Обычно при этом создается файл с дампом ядра. Этот файл в текущем каталоге, названный core, представляет собой образ процесса, который может оказаться полезным при отладке.

К дополнительным относятся сигналы, приведенные в табл. 11.4.

Таблица 11.4

Имя сигналаОписание
SIGCHLDДочерний процесс остановлен или завершился
SIGCONTПродолжить выполнение, если процесс был приостановлен
SIGSTOPОстановить выполнение (не может захватываться или игнорироваться)
SIGTSTPСигнал останова, посылаемый с терминала
SIGTTINФоновый процесс пытается читать
SIGTTOUФоновый процесс пытается писать

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

Чуть позже мы рассмотрим более подробно первую группу сигналов. Пока же достаточно знать, что если командная оболочка и драйвер терминала нормально настроены, ввод символа прерывания (обычно от нажатия комбинации клавиш +) с клавиатуры приведет к отправке сигнала SIGINT приоритетному процессу, т.е. программе, выполняющейся в данный момент. Это вызовет завершение программы, если в ней не предусмотрен перехват сигнала,

Перейти на страницу:

Похожие книги