Глава 1. Системы связи и способы передачи сообщений
1.1. Сообщение и сигнал
Понятия «информация» и «сообщение» употребляют довольно часто. Эти близкие по смыслу понятия сложны, и дать их точное определение через более простые нелегко. В общем случае под информацией понимают совокупность сведений о каких-либо событиях, явлениях или предметах. Для передачи или хранения информации используют различные знаки (символы), позволяющие выразить (представить) ее в некоторой форме. Этими знаками могут быть слова и фразы в человеческой речи, жесты и рисунки, формы колебаний, математические знаки и т. п. Совокупность знаков, содержащих ту или иную информацию, называют сообщением. Так, при телеграфной передаче сообщением является текст телеграммы, представляющий собой последовательность отдельных знаков — букв и цифр. При разговоре по телефону сообщением является непрерывное изменение во времени звукового давления, отображающее не только содержание, но и интонацию, тембр, ритм и иные свойства речи. При передаче движущихся изображений в телевизионных системах сообщение представляет собой изменение во времени яркости элементов изображения.
Передача сообщении (а следовательно, и информации) на расстояние осуществляется с помощью какого-либо материального носителя (бумаги, магнитной ленты и т. п.) или физического процесса (звуковых или электромагнитных волн, тока и т. п.). Физический процесс, отображающий (несущий) передаваемое сообщение, называется сигналом.
В качестве сигнала можно использовать любой физический процесс, изменяющийся в соответствии с переносимым сообщением. В современных системах управления и связи чаще всего используют электрические сигналы. Физической величиной, определяющей такой сигнал, является ток или напряжение! Сигналы формируются путем изменения тех или иных параметров физического носителя по закону передаваемых сообщений. Этот процесс (изменения параметров носителя) принято называть модуляцией.
Сообщения могут быть функциями времени, например речь — при передаче телефонных разговоров, температура или давление воздуха при передаче телеметрических данных, спектакль при передаче по телевидению и т. п. В других случаях сообщение не является функцией времени (например, текст телеграммы, неподвижное изображение и т. д.).
Сигнал является функцией времени, даже если сообщение таковым не является. Если сигнал представляет собой функцию u(t), принимающую только определенные дискретные значения un (например, 1 и 0), то его называют дискретным, или, точнее, дискретным по состояниям. Точно так же и сообщение, принимающее только некоторые определенные значения, называют дискретным. Если же сигнал (или сообщение) может принимать любые значения в некотором интервале, то он называется непрерывным по состояниям, или аналоговым.
В некоторых случаях сообщение или сигнал задают не на всей оси времени, а в определенные моменты tn. Такие сообщения (сигналы) называют дискретными по времени в отличие от непрерывных по времени, заданных на всей оси t. Например, речь является сообщением непрерывным как по состояниям, так и по времени, а датчик температуры, выдающий ее значения через каждые 5 мин, служит источником сообщений, непрерывных по состояниям, но дискретных по времени. На рис. 1.1, наглядно проиллюстрированы дискретные и непрерывные сигналы.
Не следует думать, что дискретные сообщения обязательно преобразуются в дискретные сигналы, а непрерывные сообщения — в непрерывные сигналы. В ряде случаев непрерывные сигналы используют для передачи дискретных сообщений, а дискретные сигналы-для передачи непрерывных сообщений.
Сообщение с помощью датчиков обычно преобразуется в электрическую величину b(t) -первичный сигнал. При передаче речи такое преобразование выполняет микрофон, при передаче изображения — телевизионная камера. В большинстве случаев первичный сигнал является низкочастотным колебанием, которое отображает передаваемое сообщение.
Рис. 1.1. Основные виды сигналов: а — непрерывный по состояниям и по времени; б -дискретный по состояниям, непрерывный по времени; в — непрерывный по состояниям, дискретный по времени; г — дискретный по состояниям и по времени
В некоторых случаях первичный сигнал, непосредственно передают по линии. Так поступают, например, при обычной городской телефонной связи. Для передачи на большие расстояния (по кабелю или радио) первичный сигнал преобразуют в высокочастотный сигнал.
Если бы передаваемое сообщение было детерминированным, т. е. заранее известным с полной достоверностью, то передача его не имела бы смысла. Такое детерминированное сообщение не содержит информации. Поэтому сообщения следует рассматривать как случайные события (или случайные величины, случайные функции). Другими словами, должно существовать некоторое множество вариантов сообщения (например, множество различных результатов хоккейного матча), из которых реализуется с определенной вероятностью одно. Поэтому и сигнал является случайной функцией. Детерминированный сигнал не может быть переносчиком информации. Его можно использовать лишь для испытаний системы связи или отдельных ее элементов.
Случайный характер сообщений, сигналов, а также помех обусловил важнейшее значение теории вероятности в построении теории связи. Как будет показано в последующих главах, вероятностные свойства сигналов и сообщений, а также среды, в которой передается сигнал, позволяют определить количество передаваемой информации и ее потери.
Описанием конкретного сигнала может быть некоторая функция времени u(t). Определив так или иначе эту функцию, определяем и сигнал. Однако такое полное описание сигнала не всегда требуется. Для решения ряда вопросов достаточно более общего описания в виде нескольких параметров, характеризующих основные свойства сигнала, подобно тому, как это делается в системах транспортирования. Указывая габаритные размеры и массу, характеризуем основные свойства предмета с точки зрения условий его перевозки; другие свойства (например, цвет) с этой точки зрения являются несущественными.
Сигнал также является объектом транспортировки, а техника связи, по существу, техникой транспортирования (передачи) сигналов по каналам связи. Поэтому целесообразно определить параметры сигнала, которые являются основными с точки зрения его передачи. Такими параметрами являются длительность сигнала Тс, его динамический диапазон Dc и ширина спектра Fc.
Всякий сигнал, рассматриваемый как временной процесс, имеет начало и конец. Поэтому длительность сигнала Тс является естественным его параметром, определяющим интервал времени, в пределах которого сигнал существует.
Динамический диапазон — это отношение наибольшей мгновенной мощности сигнала к той наименьшей мощности, которую необходимо отличать от нуля при заданном качестве передачи. Он выражается обычно в децибелах. Динамический диапазон речи Диктора, например, равен 25 . 30 дБ, небольшого вокального ансамбля 45. 65 дБ, симфонического оркестра 70 . 95 дБ. Во избежание перегрузок канала в радиовещании динамический диапазон часто сокращают до 35 . 45 дБ.
И, наконец, ширина спектра сигнала Fс. Этот параметр дает представление о скорости изменения сигнала внутри интервала его существования. Спектр сигнала, в принципе, может быть неограниченным. Однако для любого сигнала можно указать диапазон частот, в пределах которого сосредоточена его основная энергия. Этим диапазоном и определяется ширина спектра сигнала.
В технике связи спектр сигнала часто сознательно сокращают. Это обусловлено тем, что аппаратура и линия связи имеют ограниченную полосу пропускаемых частот. Сокращение спектра осуществляется исходя из допустимых искажений сигнала. Например, при телефонной связи требуется, чтобы речь была разборчива и чтобы корреспонденты могли узнать друг друга по голосу. Для выполнения этих условий достаточно передать речевой сигнал в полосе от 300 до 3400 Гц. Передача более широкого спектра речи в этом случае нецелесообразна, так как ведет к техническим усложнениям и увеличению затрат. Аналогично необходимая ширина спектра телевизионного сигнала определяется требуемой четкостью изображения. При стандарте в 625 строк, который принят в Советском Союзе, верхняя частота сигнала достигает 6 МГц. Спектр сигнала изображения много шире спектра сигнала звукового сопровождения. Это существенно усложняет построение систем телевизионного вещания по сравнению с системами звукового вещания. Ширина спектра телеграфного сигнала зависит от скорости передачи и обычно принимается равной Fc≈1,5v, где v — скорость телеграфирования в бодах, т. е. число символов, передаваемых в секунду. Так, при телетайпной передаче v = 50 Бод и Fc≈75 Гц.
Спектр модулированного сигнала обычно шире спектра передаваемого сообщения (первичного сигнала) и зависит от вида модуляции. Можно ввести более общую и наглядную характеристику — объем сигнала:
Объем сигнала Vc дает общее представление о возможностях данного множества сигналов как переносчиков сообщений. Чем больше объем сигнала, тем больше информации можно «вложить» в этот объем и тем труднее передать такой сигнал по каналу связи. Информационный смысл объема сигнала рассмотрен в гл. 4.
Источник
Основы передачи сигналов
Передача сигналов – это процесс транспортировки информации между конечными пунктами системы или сети. Сигнал, как носитель информации, проходит длинный путь и на этом пути ему встречается много устройств, таких как коммутационные станции, линии, модуляторы и демодуляторы, передатчики и приемники. Ниже мы рассмотрим основные элементы системы передачи и осудим их роль в успешной передаче сигналов.
Обобщенная схема передачи сигналов приведена на рис. 7.9.
Рис. 7.9. Обобщенная схема передачи сигналов
На схеме не показаны преобразователи, в которых мы нуждаемся для того, чтобы преобразовать сообщение в электрический сигнал. Они не входят непосредственно в систему передачи сигналов.
Зато показаны шумы помехи и искажения, являющиеся не именными спутниками сигналов при их передаче. Заметим, что двунаправленные коммуникации требуют другой системы для одновременной передачи сигнала в противоположном направлении.
Передатчик обрабатывает входной сигнал и производит передаваемый сигнал, подходящий по характеристикам каналу передачи. Обработка сигнала для передачи часто включает в себя кодирование и модуляцию. В случае оптической линии связи преобразование электрического сигнала в оптический производится передатчиком.
Линия передачипредставляет собой физическую среду, которая перекидывает мостик от источника к пункту назначения. Это может быть пара проводов, коаксиальный кабель или оптоволокно. Передача по линии связана с потерями энергии и потому мощность передаваемого сигнала постоянно уменьшается с увеличением пройденного пути. Сигнал также искажается в линии по форме вследствие неодинаковости ослабления в линии имеющихся в нем колебаний различных частот. Изменение сигнала по форме принято называть искажениями. Заметим, что линия часто включает в себя много каналов для передачи речи или данных, которые объединяются в одной паре проводов или оптоволокне.
Приемникобрабатывает получаемый из линии сигнал для того, чтобы потом подать его на вход преобразователя в пункте назначения. Операции приемника включают в себя:
— фильтрацию, чтобы исключить шумы в частотном диапазоне, расположенном за пределами спектра сигнала,
— усиление, чтобы компенсировать ослабление в линии;
-коррекцию, чтобы компенсировать искажения формы сигнала;
— демодуляцию и декодирование, чтобы сделать сигнал идентичным с тем, что был передан передатчиком.
Шумы, искажения и помехи.Много нежелательных факторов сопровождают передачу сигнала. Ослабление нежелательно, т.к. уровни входного и выходного сигналов должны быть одинаковыми.
Более серьезные проблемы связаны с искажениями в линии, помехами и шумами. В качестве средств борьбы с искажениями сигнала в приемнике всегда используют частотные корректоры, а для борьбы с шумами фильтры, которые пропускают электрические колебания только в частотном диапазоне, определяемом спектром сигнала.
Дата добавления: 2015-02-07 ; просмотров: 5369 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ
Источник
Лекция №4
Тема: Сигналы.
Вопрос 1. Концепция сигналов. Типы сигналов
Концепция сигналов имеет несколько аспектов, связанных с тем, каким образом ядро посылает сигнал процессу, каким образом процесс обрабатывает сигнал и управляет реакцией на него. Посылая сигнал процессу, ядро устанавливает в единицу разряд в поле сигнала записи таблицы процессов, соответствующий типу сигнала. Если процесс находится в состоянии приостанова с приоритетом, допускающим прерывания, ядро возобновит его выполнение. На этом роль отправителя сигнала (процесса или ядра) исчерпывается. Процесс может запоминать сигналы различных типов, но не имеет возможности запоминать количество получаемых сигналов каждого типа.
Ядро проверяет получение сигнала, когда процесс собирается перейти из режима ядра в режим задачи, а также когда он переходит в состояние приостанова или выходит из этого состояния с достаточно низким приоритетом планирования. Ядро обрабатывает сигналы только тогда, когда процесс возвращается из режима ядра в режим задачи. Таким образом, сигнал не оказывает немедленного воздействия на поведение процесса, исполняемого в режиме ядра.
Если процесс исполняется в режиме задачи, а ядро тем временем обрабатывает прерывание, послужившее поводом для посылки процессу сигнала, ядро распознает и обработает сигнал по выходе из прерывания.
Таким образом, процесс не будет исполняться в режиме задачи, пока какие-то сигналы остаются необработанными.
Сигналы являются способом передачи от одного процесса другому или от ядра операционной системы какому-либо процессу уведомления о возникновении определенного события.
Сигналы можно рассматривать как простейшую форму межпроцессного взаимодействия.
Процесс может посылать сигналы другим процессам и самому себе. Основное назначение сигналов – управление процессами. В частности, с помощью сигналов пользователи, ядро могут прерывать зависшие процессы или реализовать простые средства межпроцессорного взаимодействия.
Сигналы сообщают процессам о возникновении асинхронных событий. Посылка сигналов производится процессами друг другу, с помощью функции kill или ядром.
Каждому типу сигналов присвоено мнемоническое имя:
SIGALRM – сигнал таймера. Посылается ядром. Временной интервал может быть установлен самим процессом функцией alarm;
SIGABRT – аварийное завершение процесса. Может быть инициализирован
SIGBUS – сигнал ошибки на шине (при попытке обращения к допустимому виртуальному адресу, для которого нет физической страницы). Вызывает аварийное завершение;
SIGCHLD – посылается в родительский процесс при завершении дочернего;
SIGCONT – возобновлять остановленный процесс;
SIGHUP – разрыв связи с управляющим терминалом;
SIGILL – попытка выполнить недопустимую машинную команду;
SIGINT – прерывание процесса. Обычно генерируется клавишей DELETE
SIGKILL – уничтожение процесса. Может генерироваться командой kill; SIGPIPE – попытка выполнить недопустимую запись в канал;
SIGPOLL – сигнал о возникновении одного из опрашиваемых событий;
SIGPROF – сигнал профилирующего таймера. Работает при взаимодействии с сигналом SIGALARM;
SIGQUIT – выход из процесса. Обычно CTRL \;
SIGSEGV – ошибка сегментации;
SIGSTOP – остановить процесс;
SIGSYS – некорректный системный вызов;
SIGTERM – завершение процесса. Обычно kill
; SIGTRAP – сигнал трассировочного прерывания; SIGTSTP – остановить процесс. Обычно CTRL+Z;
SIGTTIN – остановить фоновый процесс, если он пытается читать данные со своего управляющего терминала;
SIGTTOU – сигнал о попытке вывода на терминал фоновым процессом; SIGURG – сигнал о поступлении в буфер сокета срочных данных; SIGUSR1 SIGUSR2 – определяется пользователем;
SIGVTALRM – сигнал виртуального таймера;
SIGXCPU – сигнал о превышении лимита процессорного времени;
SIGXFSZ – сигнал о превышении предела на размер файла.
Сигналы обеспечивают простой метод программного прерывания работы процессов.
Процесс может выполнять три действия с сигналами, а именно:
- изменять свою реакцию на поступление определенного сигнала (изменять обработку сигналов);
- блокировать сигналы (откладывать их обработку) на время выполнения определенных критических участков кода;
- посылать сигналы другим процессам.
Вопрос 2. Алгоритм обработки сигналов
Ядро обрабатывает сигналы в контексте того процесса, который получает их, поэтому, чтобы обработать сигналы, нужно запустить процесс.
При получении сигнала процесс может выполнить одно из трех действий:
-
- выполнить действие по умолчанию;
- игнорировать сигнал и продолжать выполнение;
- выполнить определенное пользователем действие.
Реакцией по умолчанию со стороны процесса, исполняемого в режиме ядра, является вызов функции exit, однако с помощью функции signal процесс может указать другие специальные действия, принимаемые по получении тех или иных сигналов.
В пространстве процесса поддерживается массив полей для обработки сигналов. По одному полю на каждый определенный в системе сигнал. В поле, соответствующем сигналу с указанным номером, ядро сохраняет адрес пользовательской функции, вызываемой по получении сигнала процессом. Способ обработки сигналов одного типа не влияет на обработку сигналов других типов.
Обрабатывая сигнал, ядро определяет тип сигнала и очищает (гасит) разряд в записи таблицы процессов, соответствующий данному типу сигнала и установленный в момент получения сигнала процессом. Если функции обработки сигнала присвоено значение по умолчанию, ядро в отдельных случаях перед завершением процесса сбрасывает на внешний носитель (дампирует) образ процесса в памяти. Дампирование удобно для программистов тем, что позволяет установить причину завершения процесса и посредством этого вести отладку программ. Ядро дампирует состояние памяти при поступлении сигналов, которые сообщают о каких-нибудь ошибках в выполнении процессов, как, например, попытка исполнения запрещенной команды или обращение к адресу, находящемуся за пределами виртуального адресного пространства процесса. Ядро не дампирует состояние памяти, если сигнал не связан с программной ошибкой. Если процесс получает сигнал, на который было решено не обращать внимание, выполнение процесса продолжается так, словно сигнала и не было. Поскольку ядро не сбрасывает значение соответствующего поля, свидетельствующего о необходимости игнорирования сигнала данного типа, то когда сигнал поступит вновь, процесс опять не обратит на него внимание.
Если процесс получает сигнал, реагирование на который было признано необходимым, сразу по возвращении процесса в режим задачи выполняется заранее условленное действие, однако прежде чем перевести процесс в режим задачи, ядро еще должно предпринять следующие шаги:
- ядро обращается к сохраненному регистровому контексту задачи и выбирает значения счетчика команд и указателя вершины стека, которые будут возвращены пользовательскому процессу;
- сбрасывает в пространстве процесса прежнее значение поля функции обработки сигнала и присваивает ему значение по умолчанию;
- создает новую запись в стеке задачи, в которую при необходимости выделяя дополнительную память, переписывает значения счетчика команд и указателя вершины стека, выбранные ранее из сохраненного регистрового контекста задачи. Стек задачи будет выглядеть так, как будто процесс произвел обращение к пользовательской функции (обработка сигнала) в той точке, где он вызывал системную функцию или где ядро прервало его выполнение (перед опознанием сигнала);
- вносит изменения в сохраненный регистровый контекст задачи, устанавливает значение счетчика команд равным адресу функции обработки сигнала, а значение указателя вершины стека равным глубине стека задачи.
Эту ситуацию можно разобрать следующим образом. Процесс обращается к системной функции signal для того, чтобы дать указание принимать сигналы о прерываниях и исполнять по их получении функцию sigcatcher. Затем он порождает новый процесс, запускает системную функцию nice, позволяющую сделать приоритет запуска процесса-родителя ниже приоритета его потомка, и входит в бесконечный цикл. Порожденный процесс задерживает свое выполнение на 5 секунд, чтобы дать родительскому процессу время исполнить системную функцию nice и снизить свой приоритет. После этого порожденный процесс входит в цикл, в каждой итерации которого он посылает родительскому процессу сигнал о прерывании (посредством обращения к функции kill). Если в результате ошибки, например, из-за того, что родительский процесс больше не существует, kill завершается, то завершается и порожденный процесс.
Вся идея состоит в том, что родительскому процессу следует запускать функцию обработки сигнала при каждом получении сигнала о прерывании. Функция обработки сигнала выводит сообщение и снова обращается к функции signal при очередном появлении сигнала о прерывании, родительский же процесс продолжает исполнять циклический набор команд.
Однако возможна и следующая очередность наступления событий:
- порожденный процесс посылает родительскому процессу сигнал о прерывании;
- родительский процесс принимает сигнал и вызывает функцию обработки сигнала, но резервируется ядром, которое производит переключение контекста до того, как функция signal будет вызвана повторно;
- снова запускается порожденный процесс, который посылает родительскому процессу еще один сигнал о прерывании;
- родительский процесс получает второй сигнал о прерывании, но перед тем он не успел сделать никаких распоряжений относительно способа обработки сигнала. Когда выполнение родительского процесса будет возобновлено, он завершится.
Второе несоответствие в обработке сигналов связано с приемом сигналов, поступающих во время исполнения системной функции, когда процесс приостановлен с допускающим прерывания приоритетом. Сигнал побуждает процесс выйти из приостанова (с помощью longjump), вернуться в режим задачи и вызвать функцию обработки сигнала. Когда функция обработки сигнала завершает работу, происходит то, что процесс выходит из системной функции с ошибкой, сообщающей о прерывании ее выполнения. Узнав об ошибке, пользователь запускает системную функцию повторно, однако более удобно было бы, если бы это действие автоматически выполнялось ядром, как в системе BSD.
Третье несоответствие проявляется в том случае, когда процесс игнорирует поступивший сигнал. Если сигнал поступает в то время, когда процесс находится в состоянии приостанова с допускающим прерывания приоритетом, процесс возобновляется, но не выполняет longjump. Другими словами, ядро узнает о том, что процесс проигнорировал поступивший сигнал только после возобнов ления его выполнения. Логичнее было бы оставить процесс в состоянии приостанова. Однако, в момент посылки сигнала к пространству процесса, в котором ядро хранит адрес функции обработки сигнала, может отсутствовать доступ. Эта проблема может быть решена путем запоминания адреса функции обработки сигнала в записи таблицы процессов, обращаясь к которой, ядро получало бы возможность решать вопрос о необходимости возобновления процесса по получении сигнала.
С другой стороны, процесс может немедленно вернуться в состояние приостанова (по алгоритм sleep), если обнаружит, что в его возобновлении не было необходимости. Однако пользовательские процессы не имеют возможности осознавать собственное возобновление, поскольку ядро располагает точку входа в алгоритм sleep внутри цикла с условием продолжения, переводя процесс вновь в состояние приостанова, если ожидаемое процессом событие в действительности не имело места.
Ко всему сказанному выше следует добавить, что ядро обрабатывает сигналы типа «гибель потомка» не так, как другие сигналы. В частности, когда процесс узнает о получении сигнала «гибель потомка», он выключает индикацию сигнала в соответствующем поле записи таблицы процессов и по умолчанию действует так, словно никакого сигнала и не поступало. Назначение сигнала «гибель потомка» состоит в возобновлении выполнения процесса, приостановленного с допускающим прерывания приоритетом. Если процесс принимает такой сигнал, он, как и во всех остальных случаях, запускает функцию обработки сигнала. Действия, предпринимаемые ядром в том случае, когда процесс игнорирует поступивший сигнал этого типа, будут описаны позже. Наконец, когда процесс вызвал функцию signal с параметром «гибель потомка» (death of child), ядро посылает ему соответствующий сигнал, если он имеет потомков, прекративших существование.
Для посылки сигналов процессы используют системную функцию kill.
Во всех случаях, если процесс, пославший сигнал, исполняется под кодом идентификации пользователя, не являющегося суперпользователем, или если коды идентификации пользователя (реальный и исполнительный) у этого процесса не совпадают с соответствующими кодами процесса, принимающего сигнал, kill завершается неудачно.
Вопрос 3. Посылка и блокировка сигналов
Наборы сигналов являются одним из основных параметров, передаваемых работающим с сигналами системным вызовам. Они просто задают список сигналов, которые необходимо передать системному вызову.
Наборы сигналов определяются при помощи типа sigset_t, который определен в заголовочном файле . Размер типа задан так, чтобы в нем мог поместиться весь набор определенных в системе сигналов.
Выбрать определенные сигналы можно, начав либо с полного набора сигналов и удалив ненужные сигналы, либо с пустого набора, включив в него нужные.
Инициализация пустого и полного набора сигналов выполняется при помощи процедур sigemptyset и sigfillset соответственно. После инициализации с набором сигналов можно оперировать при помощи процедур sigaddset и sigdelset, соответственно добавляющих и удаляющих указанные вами сигналы:
int sigemptyset (sigset_t *set); int sigfillset (sigset_t *set);
/*Добавление и удаление сигналов*/ int sigaddset (sigset_t *set, int signo); int sigdelset (sigset_t *set, int signo);
Процедуры sigemptyset (sigset_t *set); и sigfillset (sigset_t *set); имеют единственный параметр – указатель на переменную типа sigset_t.
Приложения должны вызывать sigemptyset (sigset_t *set); и sigfillset (sigset_t
*set); хотя бы один раз для каждой переменной типа sigset_t.
Процедуры sigaddset (sigset_t *set, int signo); и sigdelset (sigset_t *set, int signo); принимают в качестве параметров указатель на инициализированный набор сигналов и номер сигнала, который должен быть добавлен или удален. Второй параметр, signo, может быть символическим именем константы, таким как SIGINT, или настоящим номером сигнала, но в этом случае программа окажется системно-зависимой.
После определения списка сигналов можно задать определенный метод обработки сигнала при помощи процедуры sigaction:
int sigaction (int signo, const struct sigaction *act, struct sigaction *oact);
Первый параметр signo задает отдельный сигнал, для которого нужно определить действие. Чтобы это действие выполнялось, процедура sigaction должна быть вызвана до получения сигнала типа signo. Значением переменной signo может быть любое из ранее определенных имен сигналов, за исключением SIGSTOP и SIGKILL, которые предназначены только для остановки или завершения процесса и не могут обрабатываться по-другому.
Второй параметр, act, определяет обработчика сигнала signo.
Третий параметр, oact, если не равен NULL, указывает на структуру, куда будет помещено описание старого метода обработки сигнала.
Первое поле, sa_handler, задает обработчик сигнала signo. Это поле может иметь три вида значений:
- SIG_DFL – константа, сообщающая, что нужно восстановить обработку сигнала по умолчанию (для большинства сигналов это завершение процесса);
- SIG_IGN – константа, сообщающая, что нужно игнорировать данный сигнал. Не может использоваться для сигналов SIGSTOP и SIGKILL;
- адрес функции, принимающей аргумент типа int. Если функция объявлена в тексте программы до заполнения sigaction, то полю sa_handler можно просто присвоить имя функции. Компилятор поймет, что имелся в виду ее адрес. Эта функция будет выполняться при получении сигнала signo, а само значение signo будет передано в качестве аргумента вызываемой функции. Управление будет передано функции, как только процесс получит сигнал, какой бы участок программы при этом не выполнялся. После возврата из функции управление будет снова передано процессу и продолжится с точки, в которой выполнение процесса было прервано.
Второе поле, sa_mask, демонстрирует первое практическое использование набора сигналов. Сигналы, заданные в поле sa_mask, будут блокироваться во время выполнения функции, заданной полем sa_handler. Это не означает, что эти сигналы будут игнорироваться, просто их обработка будет отложена до завершения функции. При входе в функцию перехваченных сигнал также будет неявно добавлен к текущей маске сигналов. Все это делает механизм сигналов более надежным.
Поле sa_flags может использоваться для изменения характера реакции на сигнал signo. Например, после возврата из обработчика можно вернуть обработчик по умолчанию SIG_DFL, установив значение поля sa_flags равным SA_RESETHAND. Если же значение поля sa_flags установлено равным SA_SIGINFO, то обработчику сигнала будет передаваться дополнительная информация. В этом случае поле sa_handler является избыточным и используется поле sa_sigaction.
Передаваемая этому обработчику структура siginfo_t содержит дополнительную информацию о сигнале, такую как:
- его номер;
- идентификатор пославшего сигнал процесса и действующий идентификатор пользователя этого процесса.
Источник