sem13 - Сигналы (1114925), страница 2
Текст из файла (страница 2)
Сигнал обычно посылаетсяпроцессу при нажатии клавиш Ctrl-\ на клавиатуре (символQUIT). По умолчанию этот сигнал вызывает завершение процесса с дампом памяти. Его можно рассматривать как ошибкувыполнения программы, распознанную пользователем.SIGKILLBTНемедленное завершение процесса. Этот сигнал не может бытьобработан, заблокирован или проигнорирован и, следовательно, всегда фатален. Сигнал SIGKILL нужно рассматривать какпоследнее средство завершить работу процесса, после того, какпроцесс не завершился по SIGTERM или SIGINT.
Если сигналSIGKILL не завершил процесс, это — ошибка ядра операционной системы.SIGHUPTСигнал посылается процессу, когда отсоединяется управляющий терминал данного процесса (например, разорванное сетевоесоединение). Кроме того, сигнал посылается всем процессам всессии, когда завершается лидер сессии. Завершение процессалидера сессии означает отсоединение всех процессов в сессии отуправляющего терминала.Срабатывание таймеровSIGALRMTСработал таймер, измеряющий реальные (календарные) интервалы времени.SIGVTALRMTСработал таймер, измеряющий виртуальные интервалы времени(то есть время работы процесса в режиме пользователя).SIGPROFTСработал таймер, измеряющий время процессора, потраченноена данный процесс и в режиме пользователя, и в режиме ядра.Такой таймер используется для профилирования программы, отсюда и название.Работа с процессами и управление заданиями (job control)Продолжение на следующей странице5ИмяSIGCHLDРеакцияNSIGSTOPBSSIGCONTRSIGTSTPSSIGTTINSSIGTTOUSОписаниеЭтот сигнал посылается родительскому процессу, когда один изего сыновних процессов завершается или останавливается.Обработчик по умолчанию этого сигнала ничего не делает.
Если пользовательский обработчик сигнала устанавливается в товремя, когда есть сыновние процессы-зомби, будет ли этот обработчик вызван для процессов-зомби, зависит от конкретнойоперационной системы (Linux — нет).Для систем BSD, если сигнал SIGCHLD явно установлен как игнорируемый процессом, система не создаёт процессов-зомби, асразу уничтожает их по завершению. Однако стандарт POSIX запрещает процессам явно игнорировать сигнал SIGCHLD. Программы, написанные для BSD, в этом случае не будут работать вдругих операционных системах.Новейший стандарт Unix98 снова разрешает игнорирование сигнала SIGCHLD в стиле BSD.Сигнал останавливает выполнение процесса.
Он не может бытьобработан, проигнорирован или заблокирован.Сигнал вызывает продолжение работы процесса, если он былостановлен. Этот сигнал не может быть заблокирован. Для негоможно определить обработчик, но перед вызовом обработчикапроцесс всё равно будет продолжен.Для большинства программ не имеет смысла обрабатыватьSIGCONT. Такие программы просто продолжают свою работу, незаметив, что они были приостановлены.Интерактивный сигнал остановки выполнения процесса. В отличие от SIGSTOP этот сигнал может обрабатываться, блокироваться или игнорироваться. Сигнал генерируется, когда пользователь нажимает на клавиатуре Ctrl-Z (символ SUSP).Процесс должен обрабатывать этот сигнал, если требуетсяоставлять системные данные или файлы в целостном состояниипри остановке. Например, программа, которая отключает канонический режим ввода символов, может его снова включить приостановке.Процесс не может считывать данные с терминала, когда он запущен как фоновое задание.
Когда какой-либо процесс в фоновомзадании пытается это сделать, все процессы в задании получаютсигнал SIGTTIN. По умолчанию этот сигнал вызывает остановку выполнения процесса.Аналогично SIGTTIN, но этот сигнал генерируется, когда процесс из фонового задания пытается записать на терминал илиустановить его режимы работы. По умолчанию запись на терминал для фоновых процессов разрешена, чтобы запретить еёдолжен быть установлен режим TOSTOP терминала.Ошибки операций ввода/выводаПродолжение на следующей странице6ИмяSIGPIPEРеакцияTSIGUSR1SIGUSR2TTОписаниеПопытка записи в канал (анонимный или именованный), у которого закрыт выходной конец. Если этот сигнал блокируется, игнорируется или обрабатывается, операция, вызвавшая ошибку,завершается с кодом ошибки EPIPE.Прочие сигналыСигналы SIGUSR1 и SIGUSR2 предназначены для использования в прикладных программах произвольным образом.Когда процесс остановлен, он не может получать сигналы, кроме SIGKILL и SIGCONT.Все посланные процессу сигналы будут сделаны ожидающими доставки.
Как только процесспродолжит работу, сигналы будут ему доставлены. Когда процесс получает сигнал SIGCONT,все сигналы остановки, ожидающие доставки, будут сброшены. Аналогично, когда процессполучает сигнал остановки, все сигналы SIGCONT, ожидающие доставки, будут сброшены.1.4 Работа с множествами сигналовАргументами многих функций, работающих с сигналами, могут быть множества сигналов. Например, sigprocmask позволяет изменить множество блокируемых сигналов. Дляудобства работы с множествами сигналов стандартная библиотека предоставляет типы ифункции.
Они определены в заголовочном файле <signal.h>.Тип sigset_t должен использоваться для хранения множества сигналов. Программане должна предполагать, что этот тип эквивалентен некоторому целому типу, как изначальнобыло в системах BSD.intintintintintsigemptyset(sigset_t *pset);sigfillset(sigset_t *pset);sigaddset(sigset_t *pset, int signum);sigdelset(sigset_t *pset, int signum);sigismember(const sigset_t *pset, int signum);Функция sigemptyset очищает множество сигналов, на которое указывает pset. Пустое множество не содержит ни одного сигнала.Функция sigfillset полностью заполняет множество сигналов, на которое указываетpset.
В получившееся множество включены все сигналы.Функция sigaddset добавляет сигнал signum в множество сигналов, на которое указывает pset.Функция sigdelset удаляет из множества сигналов, на которое указывает pset, сигнал signum.Функция sigismember проверяет, присутствует ли в множестве сигналов, на котороеуказывает pset, сигнал с номером signum.1.5 Установка обработчика сигнала1.5.1 Функция signalПростейшая функция, с помощью которой можно изменить обработку сигнала, это функция signal, описанная следующим образом:7#include <signal.h>void (*signal(int, void (*handler)(int)))(int);Если ввести специальный тип для указателя на функцию-обработчик сигнала, определениефункции упростится:typedef void (*sighandler_t)(int signum);sighandler_t signal(int signum, sighandler_t handler);Первый аргумент signum задает номер сигнала, обработку которого нужно изменить.Вместо номера сигнала предпочтительнее использовать символическое имя сигнала, какопределено выше.Второй аргумент handler определяет, как будет обрабатываться сигнал.
Он может принимать следующие значения:SIG_DFL устанавливает обработку сигнала на стандартную обработку по умолчанию(см. таблицы выше).SIG_IGN задает, что сигнал должен игнорироваться. Программа не должна игнорировать сигналы, которые обозначают серьёзные программные ошибки или используются длязавершения процесса. Если процесс игнорирует сигнал SIGSEGV и другие аналогичные сигналы, его поведение после ошибки неопределено (например, он может зациклиться на местеошибки). Игнорировать запросы пользователя, такие как SIGINT и пр.
— недружественнопо отношению к пользователю.Третья возможность — это задать функцию обработки сигнала. Эта функция будет вызвана, когда процесс получит сигнал.Если обработка сигнала устанавливается в SIG_IGN, или когда обработка сигнала устанавливается в SIG_DFL, а обработка по умолчанию игнорирует сигнал, все сигналы этоготипа, ожидающие доставки, будут сброшены, даже если они заблокированы.
Такие сигналыникогда не будут доставлены, даже если впоследствии обработчик сигнала будет переустановлен, и сигнал будет разблокирован.Функция signal возвращает предыдущий обработчик сигнала. Это значение может использоваться для того, чтобы восстановить старый обработчик, если это необходимо.Функция signal присутствует в стандарте ANSI C, тем не менее её использование нерекомендуется.
Исторически существовало два подхода к обработке сигналов: подход, реализованный в System V, и подход BSD, различия между которыми приведены в таблице ниже.Поэтому рекомендуется использовать более универсальную функцию sigaction, описанную ниже.СвойствоSystem VBSDБлокировкаТекущий обрабатываемый сиг- Текущий обрабатываемый сигсигналанал не блокируется на время вы- нал блокируется на время выполнения обработчика.полнения обработчика.Сброс обработ- Обработчик переустанавливает- Обработчик не переустанавличикася на обработчик по умолчанию. вается на обработчик по умолчанию.Системные вы- Прерываются с кодом ошибки Перезапускаются.зовыEINTR.1.5.2 Пример программыВ следующем примере программа завершит работу, когда три раза будет нажата комбинация Ctrl-C.