Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы / MAKE_posix_creprc_sem_sig.DOC
Скачиваний:
27
Добавлен:
01.05.2014
Размер:
146.94 Кб
Скачать

Void(*signal(int sig, void(*func)(int)))(int);

Аргументы

sig

номер сигнала;

 

void(*func)(int)

SIG_DFL, SIG_IGN или указатель на функцию обработки сигнала (с единственным аргументом).

Возвращаемые значения

Функция возвращает указатель на ранее использовавшуюся функцию обработки сигнала.

Описание

Функция signal() позволяет опросить и задать характер действий, выполняемых по указанному сигналу (реакцию на сигнал). Аргумент sig задает номер сигнала.

Аргумент func либо определяет значение функции обработки сигналов, либо равен SIG_IGN или SIG_DFL.

SIG_IGN означает, что сигнал будет игнорироваться.

SIG_DFL означает, что будет использоваться стандартная реакцией на сигнал (то есть выполнение прикладной программы будет прекращено).

Функция обработки сигнала должна иметь один аргумент - номер сигнала.

#include <signal.h>

Int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

Аргументы

sig

номер сигнала;

 

act

указатель на структуру, описывающую вновь устанавливаемую реакцию на сигнал;

 

oact

указатель на структуру, где будет сохранена реакция на сигнал, используемая до вызова данной функции.

Возвращаемые значения

При успешном завершении функция возвращает 0. Если обнаружена ошибка, то функция возвращает значение -1, а переменной errno присваивается код ошибки.

 

[EINVAL]

аргумент sig задает неверный или необрабатываемый номер сигнала, или же сделана попытка игнорировать сигнал, который не может быть игнорирован, или указать функцию обработки сигнала, для которого не может быть указана функция обработки сигнала.

Описание

Функция sigaction() позволяет опросить и/или задать характер действий, выполняемых по указанному сигналу (реакцию на сигнал). Аргумент sig задает номер сигнала.

Если аргумент act не равен NULL, то он указывает на структуру, описывающую связываемое с сигналом действие. Если аргумент oact не равен NULL, то действие, которое было связано с данным сигналом до вызова функции, запоминается в структуре, на который указывает аргумент oact. Если аргумент act имеет значение NULL, то действие, связанное с сигналом (действие по данному сигналу) не изменяется. Таким образом, эту функцию можно использовать для опроса характера действий по указанному сигналу.

Структура sigaction, описывающая действия по сигналу, определена в заголовочном файле <signal.h> и содержит следующие элементы.

 

Тип

Имя

Описание

 

void(*)()

sa_handler

SIG_DFL, SIG_IGN или указатель на функцию обработки сигнала;

 

sigset_t

sa_mask

дополнительный список сигналов, которые должны быть блокированы при исполнении функции обработки сигнала;

 

int

sa_flags

флаг, уточняющий реакцию на сигнал;

 

void(*)(int, siginfo_t, void *)

sa_sigaction

указатель на функцию обработки сигнала.

Области памяти, отведенные под sa_handler и sa_sigaction, могут перекрываться, и корректная прикладная программа не должна использовать их одновременно. В определении функции обработки сигналов, ссылка на который хранится в sa_handler, должен быть указан единственный аргумент типа int.

Если установлен флаг SA_SIGINFO в переменной sa_flags структуры sigaction, то указатель на функцию обработки прерываний находится в переменной sa_sigaction, противном случае переменная sa_handler определяет реакцию на сигнал.

SIG_IGN означает, что сигнал будет игнорироваться.

SIG_DFL означает, что будет использоваться стандартная реакцией на сигнал (то есть выполнение прикладной программы будет прекращено).

Если бит SA_SIGINFO сброшен и элемент sa_handler задает функцию обработки сигнала (а не SIG_DFL или SIG_IGN), или если бит SA_SIGINFO установлен, то элемент sa_mask задает множество сигналов, которые должны быть добавлены к маске сигналов потока, прежде чем будет вызвана функция обработки сигнала. Сигнал SIGKILL не следует добавлять к маске сигналов таким способом.

Перед вызовом функции обработки прерываний вычисляется и устанавливается новая маска сигналов на время работы функции захвата сигнала (или до момента вызова одной из функций pthread_sigmask(),sigsuspend()). Эта маска образуется объединением текущей маски сигналов и значения sa_mask для доставляемого сигнала с последующим включением в нее номера доставляемого сигнала. Когда (и если) пользовательский обработчик сигнала нормально возвращает управление, исходная маска восстанавливается.

Как уже говорилось выше, функция обработки сигналов может иметь либо один аргумент

void func(int signo);

либо три аргумента

void func(int signo, siginfo_t *info, void *context);

Аргументы функций обработки прерываний имеют следующий смысл:

signo - номер доставляемого сигнала;

info - указатель на структуру типа siginfo_t, содержащую дополнительную информацию о сигнале;

context - в настоящей версии не используется.

Структура siginfo_t определена в заголовочном файле <signal.h> и содержит следующие элементы:

 

Тип

Имя

Описание

 

int

si_signo

номер сигнала;

 

int

si_code

причина сигнала;

 

union sigval

si_value

значение сигнала.

Элемент si_signo содержит номер сигнала. Он совпадает с содержимым аргумента signo. Элемент si_code содержат код, идентифицирующий причину сигнала. Для этого кода определены следующие значения:

    • SI_USER - сигнал был послан функцией kill(),raise()илиabort();

    • SI_QUEUE - сигнал был послан функцией sigqueue();

    • SI_TIMER - сигнал был сгенерирован в результате истечения интервала времени, заданного таймером и установленного функцией timer_settime();

    • SI_ASYNCIO - сигнал был сгенерирован в результате завершения операции асинхронного ввода/вывода;

    • SI_MESGQ - сигнал был сгенерирован в результате поступления сообщения в пустую очередь сообщений.

Если si_code имеет значение SI_QUEUE, SI_TIMER, SI_ASYNCIO или SI_MESGQ, то si_value содержит значение, указанное прикладной программой. В противном случае значение si_value не определено.

Если функция sigaction() завершается неудачей, то новый обработчик сигналов не устанавливается.

Для прикладных программ предусмотрено два сигнала: SIGUSR1 иSIGUSR2.

#define SIGHUP 1 /* Зависание hangup */

#define SIGINT 2 /* Прерывание interrupt */

#define SIGQUIT 3 /* Выход quit */

#define SIGILL 4 /* illegal instruction (not reset when caught) */

#define SIGTRAP 5 /* trace trap (not reset when caught) */

#defineSIGABRT6 /* Использованный аварийным прекращением работы*/

#define SIGEMT 7 /* EMT instruction */

#define SIGFPE 8 /* floating point exception */

#defineSIGKILL9 /*Kill(не может быть захвачен или игнорироваться) */

#define SIGBUS 10 /* Ошибка шины bus error */

#define SIGSEGV 11 /* Нарушение сегментации segmentation violation */

#define SIGFMT 12 /* STACK FORMAT ERROR (not posix) */

#define SIGPIPE 13 /*write on a pipe with no one to read it */

#define SIGALRM 14 /* alarm clock */

#define SIGTERM 15 / kill software termination signal from kill */

#define SIGSTOP 17 /* sendable stop signal not from tty */

#define SIGTSTP 18 /* stop signal from tty */

#defineSIGCONT19 /*продолжите остановленный процесс */

#defineSIGCHLD20 /* Родителю на дочернем останове или выходе */

#define SIGTTIN 21 /* to readers pgrp upon background tty read */

#define SIGTTOU 22 /* like TTIN for output if (tp->t_local&LTOSTOP) */

#define SIGUSR1 30 /* user defined signal 1 */

#define SIGUSR2 31 /* user defined signal 2 */

#define SIGRTMIN 23 /* Realtime signal min */

#define SIGRTMAX 29 /* Realtime signal max */

/*kill page 275*/

#include <iostream.h>

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <signal.h>

Соседние файлы в папке Материалы