Общая сводка сигналов
В этом разделе мы перечисляем сигналы, в которых нуждаются программы Linux и UNIX для обеспечения стандартных реакций.
Стандартное действие для сигналов, перечисленных в табл. 11.7, — аварийное завершение процесса со всеми последствиями вызова функции
_exit
(которая похожа на
exit
, но не выполняет никакой очистки перед возвратом управления ядру). Тем не менее, состояние становится доступным функции
wait
, а функция
waitpid
указывает на аварийное завершение, вызванное описанным сигналом.
Таблица 11.7
Имя сигнала | Описание |
SIGALRM
| Генерируется таймером, установленным функцией alarm
|
SIGHUP
| Посылается управляющему процессу отключающимся терминалом или управляющим процессом во время завершения каждому процессу с высоким приоритетом |
SIGINT
| Обычно возбуждается с терминала при нажатии комбинации клавиш <Ctrl>+<C> или сконфигурированного символа прерывания |
SIGKILL
| Обычно используется из командной оболочки для принудительного завершения процесса с ошибкой, т.к. этот сигнал не может быть перехвачен или проигнорирован |
SIGPIPE
| Генерируется при попытке записи в канал при отсутствии связанного с ним считывателя |
SIGTERM
| Отправляется процессу как требование завершиться. Применяется UNIX при выключении для запроса остановки системных сервисов. Это сигнал, по умолчанию посылаемый командой kill
|
SIGUSR1 , SIGUSR2
| Может использоваться процессами для взаимодействия друг с другом, возможно, чтобы заставить их сообщить информацию о состоянии |
По умолчанию сигналы, перечисленные в табл. 11.8, также вызывают преждевременное завершение. Кроме того, могут выполняться действия, зависящие от реализации, например, создание файла core.
Таблица 11.8
Имя сигнала | Описание |
SIGFPE
| Генерируется исключительной ситуацией во время операций с плавающей точкой |
SIGILL
| Процессор выполнил недопустимую команду. Обычно возбуждается испорченной программой или некорректным модулем совместно используемой памяти |
SIGQUIT
| Обычно возбуждается с терминала при нажатии комбинации клавиш <Ctrl>+<\> или сконфигурированного символа завершения (quit) |
SIGSEGV
| Нарушение сегментации, обычно возбуждается при чтении из некорректного участка памяти или записи в него, а также выход за границы массива или разыменование неверного указателя. Перезапись локального массива и повреждение стека могут вызвать сигнал SIGSEGV при возврате функции по неверному адресу |
При получении одного из сигналов, приведенных в табл. 11.9, по умолчанию процесс приостанавливается.
Таблица 11.9
Имя сигнала | Описание |
SIGSTOP
| Останавливает выполнение (не может быть захвачен или проигнорирован) |
SIGTSTP
| Сигнал останова терминала часто возбуждается нажатием комбинации клавиш <Ctrl>+<Z> |
SIGTTIN , SIGTTOU
| Применяются командной оболочкой для обозначения того, что фоновые задания остановлены, т.к. им необходимо прочесть данные с терминала или выполнить вывод |
Сигнал
SIGCONT
возобновляет остановленный процесс и игнорируется при получении неостановленным процессом. Сигнал
SIGCHLD
по умолчанию игнорируется (табл. 11.10).
Таблица 11.10
Имя сигнала | Описание |
SIGCONT
| Продолжает выполнение, если процесс остановлен |
SIGCHLD
| Возбуждается, когда останавливается или завершается дочерний процесс |
Резюме
В этой главе вы убедились, что процессы — это основной компонент операционной системы Linux. Вы узнали, как они могут запускаться, завершаться и просматриваться и как вы можете применять их для решения задач программирования. Вы также познакомились с сигналами, которые могут использоваться для управления действиями выполняющихся программ. Вы убедились, что все процессы Linux, вплоть до
init
включительно, используют одни и те же системные вызовы, доступные любому программисту.
Глава 12
Потоки POSIX
В главе 11 вы видели, как обрабатываются процессы в ОС Linux (и конечно в UNIX). Эти средства обработки множественных процессов долгое время были характерной чертой UNIX-подобных операционных систем. Порой бывает полезно заставить одну программу делать два дела одновременно или, по крайней мере, создать впечатление такой работы. А может быть, вы хотите, чтобы несколько событий произошло одновременно и все они были тесно связаны, но при этом накладные расходы на создание нового процесса с помощью функции
fork
считаете слишком большими. В таких ситуациях можно применить потоки, позволяющие одному процессу стать многозадачным.
В этой главе мы рассмотрим следующие темы:
□ создание новых потоков в процессе;
□ синхронизацию доступа к данным потоков одного процесса;
□ изменение атрибутов потока;
□ управление в одном и том же процессе одним потоком из другого.
Что такое поток?
Множественные нити исполнения в одной программе называют потоками. Более точно поток — это последовательность или цикл управления в процессе. Все программы, которые вы видели до настоящего момента, выполняли единственный процесс, хотя, как и многие другие операционные системы, ОС Linux вполне способна выполнять множественные процессы одновременно. В действительности у всех процессов есть как минимум один поток исполнения. У всех процессов, с которыми вы пока познакомились в этой книге, был только один поток исполнения.