• SIGPIPE — генерируется, когда процесс пытается выполнить запись в канал (конвейер), FIFO или сокет, для которых нет соответствующего процесса чтения. Как правило, это происходит, если файловый дескриптор читающего процесса был закрыт для канала IPC (что бы это ни значило). См. раздел 44.2 для получения более подробной информации.

• SIGPOLL — унаследован от System V, в Linux является синонимом сигнала SIGIO.

• SIGPROF — ядро генерирует этот сигнал по окончании времени профилирующего таймера, установленного вызовом функции setitimer() (см. раздел 23.1). Профилирующий таймер — это таймер, отсчитывающий время ЦПУ, затрачиваемое процессом. В отличие от виртуального (см. SIGVTALRM ниже), профилирующий таймер отсчитывает время ЦПУ, затрачиваемое как в режиме пользователя, так и в режиме ядра.

• SIGPWR — это сигнал сбоя подачи питания. В системах с источниками бесперебойного питания (ИБП) возможно установить фоновый процесс, который бы осуществлял мониторинг уровня заряда вспомогательного аккумулятора в случае сбоя подачи питания. Если заряд батареи близок к нулю (после длительного отсутствия подачи электрического тока), то процесс, осуществляющий мониторинг, отправляет сигнал SIGPWR в процесс init, интерпретирующий данный сигнал как требование завершить работу системы быстро и в установленном порядке.

• SIGQUIT — когда пользователь вводит символ выхода (обычно Ctrl+\) с клавиатуры, этот сигнал посылается группе приоритетных процессов. По умолчанию он завершает процесс и создает дамп ядра, который затем может быть использован для отладки. Применение SIGQUIT таким образом может быть полезным, если программа застряла в бесконечном цикле или не отвечает по другим причинам. Нажимая Ctrl+\, затем загружая получившийся дамп ядра с помощью отладчика gdb и используя команду backtrace для получения трассировки стека, мы можем выяснить, какая часть программного кода выполнялась. ([Matloff, 2008] описывает использование gdb.)

• SIGSEGV — очень распространенный сигнал. Генерируется, когда программа обращается по неверной ссылке на ячейку в памяти. Ссылка может быть неверной из-за того, что страница, на которую ссылаются, не существует (например, находится в неразмеченной области где-то между кучей и стеком), процесс пытался обновить участок в памяти только для чтения (например, текстовый сегмент программы или участок отображаемой памяти, помеченный «только для чтения») или процесс пытался получить доступ к части памяти ядра, работая в режиме пользователя (см. раздел 2.1). В языке С такие события часто являются результатом разыменования указателя, содержащего неверный адрес (например, неинициализированного указателя) или передачи неверного аргумента в вызов функции. Название сигнала происходит от термина segmentation violation — «нарушение сегментации».

• SIGSTKFLT — задокументирован в signal(7) как «ошибка стека на сопроцессоре». Сигнал определен, но не используется в Linux.

• SIGSTOP — сигнал императивной остановки процесса. Не может быть заблокирован, проигнорирован или перехвачен обработчиком, то есть он всегда останавливает процесс.

• SIGSYS — генерируется, если процесс совершает «плохой» системный вызов. Это значит, что процесс выполнил инструкцию, которая была интерпретирована как прерывание системного вызова, но номер связанного системного вызова не был допустимым.

• SIGTERM — стандартный сигнал, который применяется для завершения процесса и по умолчанию посылается командами kill и killall. Иногда пользователи явно посылают сигнал SIGKILL процессу, используя команды kill — KILL или kill –9. Но это, как правило, ошибка. У хорошо спроектированного приложения будет обработчик для SIGTERM, который вызывает корректное завершение приложения, позволяя ему стереть временные файлы и заблаговременно высвободить другие ресурсы. Завершение процесса с помощью SIGKILL обходит обработчик SIGTERM. Следовательно, мы всегда должны сначала попытаться завершить процесс, используя SIGTERM, и приберечь SIGKILL в качестве последнего средства для завершения вышедших из-под контроля процессов, не отвечающих на SIGTERM.

• SIGTRAP — сигнал используется для реализации точек прерывания отладчика и отслеживания системных вызовов, выполняемых утилитой strace(1). Для получения более подробной информации см. страницу справочника, посвященную вызову ptrace(2).

• SIGTSTP — это сигнал стоп, отправляемый группе приоритетных процессов, когда пользователь вводит с клавиатуры символ приостановки (обычно Ctrl+Z). В главе 34 в деталях описываются группы процессов (задания), собственно контроль задания, а также когда и как программе может потребоваться обработать данный сигнал. Имя этого сигнала происходит от английского terminal stop — «остановка с терминала».

• SIGTTIN — во время работы в оболочке, управляющей заданием, драйвер терминала отправляет данный сигнал группе фоновых процессов при попытке чтения (read()) с управляющего терминала. По умолчанию данный сигнал останавливает процесс.

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

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