Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Обработка сигналов

Читайте также:
  1. Dynamics Range Processing - универсальная динамическая обработка
  2. Автокорреляционная функция ЛЧМ-сигнала. Сечения функции неопределенности ЛЧМ-сигнала. Выбор класса зондирующих сигналов для РЛС.
  3. Автоматизированная обработка учета складских операций и реализации продукции
  4. Аналитическая обработка данных, системы оперативной аналитической обработки (ОLAP).
  5. Базы персонифицированного учета (сбор и обработка индивидуальных сведений, обеспечение их достоверности)
  6. Временные преобразования цифровых сигналов
  7. Выполнять требования запрещающих, предупреждающих, указательных и предписывающих знаков,надписей,а также сигналов,подаваемых

Сигналы генерируется, когда происходят определенные события, которые вызывают посылку сигнала. Сигнальные события могут быть вызвананы программными и аппаратными причинами, прерыванием от терминала, результатом измерения времени и выполнением других процессов. Если инициатор сигнала ядро, другой процесс или интерактивные действия пользователя, то сигнал считается асинхронным по отношению к процессу-приемнику сигнала. Когда сигнал инициируется выполнением инструкций процесса-приемника, сигнал считается синхронным. В обоих случаях получение сигнала вызывает прерывание работы процесса-приемника сигнала и выполнение заранее определенных действий по его обработке.

Каждый сигнал имеет уникальный номер, однозначно определяющий событие, которым он вызван. Классические версии OS UNIX определяли 16 сигналов с номерами от 1 до 16. В современных версиях OS UNIX список сигналов расширен до 32. Для удобства спецификации сигналов используются символьные мнемоники. Ниже перечислены мнемоники основных сигналов, с кратким описанием событий, инициирующих их появление.

 

1. SIGHUP - разрыв связи с терминалом;
2. SIGINT - прерывание от терминала, генерируется при нажатии Ctrl-C;
3. SIGQUIT - сигнал выхода, генерируется при нажатии Ctrl-\.

 

 

4. SIGILL - попытка выполнить нелегальную машинную инструкцию;
5. SIGFPE - десятичное переполнение или деление на 0;
6. SIGBUS - ошибка шины при неверной косвенной адресации;
11. SIGSEGV - нарушение границ сегментов адресного пространства;
12. SIGSYS - неверный параметр при обращении к системному вызову;
13. SIGPIPE - разрыв программного канала.

 

 

14. SIGALRM - генерируется ядром при истечении интервала, заданного системным вызовом alarm.

 

 

9. SIGKILL - безусловное завершение процесса;
15. SIGTERM - условное завершение процесса;
16. SIGUSR1 - сигнал, определенный пользователем;
17. SIGUSR2 - сигнал, определенный пользователем;
18. SIGCLD - изменение статуса процесса-потомка;
19. SIGPWR - рестарт по сбою питания;
23. SIGSTOP - приостановка выполнения процесса;
24. SIGCONT - возобновление выполнения приостановленного процесса.

Возможность принудительной посылки конкретному процессу или группе процессов определенного сигнала даже при отсутствии реальной причины его возникновения обеспечивают системный вызов и команда kill. Их аргументы задают номер сигнала и идентификатор процесса-приемника сигнала. Значение идентификатора процесса-приемника должно быть больше 0, когда сигнал посылается процессу индивидуально. При распределенной посылке сигнала аргумент идентификации приемника может быть равен 0, когда сигнал посылается группе процессов, равен (-1), когда сигнал посылается всем процессам владельца процесса-источника сигнала, либо меньше (-1), когда сигнал посылается всем процессам группы владельца процесса, инициатора сигнала.

Для организации обработки сигналов используются следующие сигнальные поля структуры struct proc дескриптора процесса-приемника сигнала: p_sig, p_hold, p_cursig, p_ignore и p_catch.

Поле p_sig используется для регистрации номера принятого сигнала. При этом применяется следующий способ регистрации. Если принят сигнал с номером n, то устанавливается бит (n-1) поля p_sig, который будет сброшен после обработки сигнала. Например, значения поля p_sig, равное 5, означает регистрацию сигналов SIGHUP и SIGQUIT с номерами 1 и 3, соответственно. Следует отметить, что OS UNIX не поддерживает очередь сигналов. Поэтому, если процесс принял последовательно несколько одинаковых сигналов до начала обработки 1-го из них то будет обработан только результат последнего приема. Очевидно, что разнотипные сигналы могут быть одновременно зарегистрированы в поле p_sig и обработаны в порядке их поступления. Поле p_cursig сохраняет номер текущего сигнала, который должен быть обработан.

Поле p_hold фиксирует номера сигналов, обработка которых должна быть задержена на период выполнения какого-либо блока инструкций процедурного сегмента программы процесса. Блок программы процесса, когда появление определенных сигналов нежелательно должен быть ограничен системными вызовами sighold и sigrelse, которые, соответственно, задерживают и освобождают обработку указанных сигналов.

Поля p_ignore и p_catch определяют форму реакции процесса на получение сигнала. После получения сигнала возможны 3 альтернативы реакции процесса - обработка по умолчанию, игнорирование и перехват. Вид реакции устанавливает системный вызов signal, которому в качестве аргументов передается номер сигнала и адрес функции обработки.

Когда нужно установить стандартную обработку, принятую по умолчанию, в системный вызов signal вместо адреса функции обработки передается 0 или макрос SIG_DFL. Стандартной реакцией процесса на большинство сигналов является принудительное завершение процесса. Реакция по умолчанию на такие сигналы как SIGQUIT, SIGFPE, SIGSEGV, SIGBUS, SIGSYS приводит к принудительному завершению процесса с образованием файла дампа памяти core.

Когда в процессе нужно игнорировать сигнал, в системный вызов signal вместо адреса функции обработки передается 1 или макрос SIG_IGN. Почти все сигналы могут быть принудительно игнорированы. По умолчанию игнорируются сигналы, которые не должны приводить к завершению процесса, например, SIGCLD, SIGUSR1, SIGUSR2.

Под перехватом сигнала понимается передача в системный вызов signal, адреса функции, которая реализует желаемую реакцию процесса на данный сигнал. Следует отметить, что после перехвата сигнала автоматически восстанавливается стандартная реакция на него. Поэтому целесообразно переустанавливать перехват сигнала системным вызовом signal, когда нужно сохранить его нестандартную обработку. Когда необходимость в перехвате сигнала исчерпана следует восстановить обработку по умолчанию, используя системный вызов signal с аргументом 0 или SIG_DFL. Следует отметить, что сигнал безусловного завершения SIGKILL с номером 9 не может быть игнорирован или перехвачен никаким процессом. Следующий фрагмент С -кода демонстрирует перехват сигнала прерывания от терминала.

#include < signal.h >

/* Функция обработки сигнала SIGINT */

void handler() {
signal(SIGINT, handler);
puts("Сигнал SIGINT перехвачен");
return;
} /* handler */


/* Основная функция программы процесса */

main() {
 
/* Установка перехвата сигнала SIGINT */
 
signal(SIGINT, handler);
 
/* Код программы процесса, где перехвачен сигнал SIGINT */
 
.........................................................
 
 
/* Восстановление стандартной обработки сигнала SIGINT */
 
signal(SIGINT, SIG_DFL);
 
} /* main */

Установленная реакция процесса на сигналы отражается контекстом процесса в форме таблице сигналов u_signal. Записи этой таблицы упорядочены по номерам сигналов в виде массива адресов их функций обработки. Формально каждый элемент таблицы сигналов может принимать одно из 3-х значений в соответствии с выбранной альтернативой обработки:

u_signal[i] = 0 - принята обработка по умолчанию сигнала i+1;
u_signal[i] = 1 - установлено игнорирование сигнала i+1;
u_signal[i] = n - адрес функции обработки в адресном пространстве процесса при перехвате сигнала i+1.

Порожденный процесс наследует весь контекст обработки сигналов от процесса-предка. После смены программы выполнения процесса системным вызовом семейства exec, установленная нестандартная обработка сигналов будет игнорирована. Если сигнал был принят во время реализации системного вызова, то выполнение последнего будет прервано для обработки сигнала. После завершения обработки сигнала прерванный системный вызов перезапускается автоматически. В заключении следует отметить, что механизм обработки сигналов в OS UNIX позволяет реализовать популярную в настоящее время методологию событийного программирования.

 

 

 

 

Всилу необходимости решения указанных проблем, коммуникация процессов через файл применяется редко. С другой стороны, OS UNIX предоставляет более совершенные средства межпроцессной коммуникации, обычно именуемые IPC (Inter Process Communication). Средства IPC свободны от указанных выше недостатков межпроцессного обмена через файл. Традиционно, к средствам IPC в OS UNIX относятся: именованные и неименованные (обычные) программные каналы, разделяемая память, семафоры, очереди сообщений.

 

13.

14.


Дата добавления: 2015-12-07; просмотров: 84 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.009 сек.)