|
Программирование >> Структурное программирование
Рис. 18.5. Сигналы, определяемые в файле заголовочный signal.h виш <ctrl> с в UNIX или DOS), недопустимая команда, ошибочный доступ к памяти (нарушение сегментации), запрос от операционной системы о завершении работы и ошибка операций с вещественными числами (деление на нуль или перемножение слишком больших действительных чисел). Библиотека обработки сигналов содержит функцию signal, перехватывающую непредвиденные события. Функция signal получает два параметра: целочисленный номер сигнала и указатель на функцию обработки сигнала. Сигналы могут генерироваться функцией raise, которая получает целочисленное значение номера сигнала в качестве аргумента. На рис. 18.5 перечислены стандартные сигналы, определяемые в заголовочном файле signal.h. В программе на рис. 18.6 демонстрируется использование функций signal и raise. В программе на рис. 18.6 функция signal используется для перехвата интерактивного сигнала (SIGINT). Программа начинается с вызова функции signal с аргументами SIGINT и указателем на функцию signal handler (не забудьте, что имя функции - это указатель, ссылающийся на начало функции). Когда генерируется сигнал типа SIGINT, управление передается функции signal handler, которая выводит сообщение и предлагает пользователю возможность продолжить нормальное выполнение программы. Если пользователь желает продолжить выполнение программы, обработчик сигнала повторно инициализируется вызовом функции signal (в некоторых системах требуется повторная инициализация обработчика сигнала) и управление передается в точку программы, в которой сигнал был обнаружен. В этой программе интерактивный сигнал моделируется при помощи вызова функции raise. Для этой цели генерируются случайные числа в диапазоне от 1 до 50. Как только будет получено случайное число 25, будет вызвана функция raise, генерирующая нужный сигнал. Обычно, интерактивные сигналы возникают за пределами программы. Например, при нажатии во время выполнения программы комбинации клавиш <ctrl> с в UNIX или DOS генерируется интерактивный сигнал, в результате которого выполнение программы завершается. Обработка сигналов может использоваться для перехвата интерактивного сигнала и предотвращения прерывания программы. void signal handler(int signalValue) { cout endl << Получен сигнал прерывания ( signalValue ). endl << Хотите продолжать (1 = да или 2 = нет)? int response; cin response; while (response != 1 && response != 2) { cout (1 = да или 2 = нет)? ; cin response; if (response == 1) signal(SIGINT, signal handler); w else exit(EXIT SUCCESS); Рис. 18.6. Использование обработки сигнала (чааь 1 из 2) Обработка сигналов #include <iostream.h> #include <iomanip.h> Iinclude <signal.h> iclude <stdlib.h> iclude <time.h> )id signal handler(int); lin () signal (SIGINT, signal handler); srand(time(NULL)) ; for (int i = 1; i < 101; i++) { int X = 1 + randO % 50; if (X == 25) raise(SIGINT); cout setw(4) i; if (i % 10 == 0) cout endl; return 0; Получен сигнал прерывания (4). ХоФИФв продолжать (1 = да или 2 = нет)? 1 89 90 91 92 93 94 95 96 97 98 99 100 Рис. 18.6. Использование обработки сигнала (часть 2 из 2) 18.10. Динамическое выделение памяти: функции calloc и realloc в главе 7, когда мы обсуждали динамическое выделение памяти в стиле С++ с помощью операторов new и delete, мы сравнивали их с функциями С malloc и free. Программисты на С++ должны использовать для выделения памяти new и delete, а не malloc и free. Однако, многие, программирующие на С++, сталкиваются с большим числом программ, полученных в наследство от языка С. Вот почему мы дополнительно обсуждаем динамическое выделение памяти в стиле С. Библиотека утилит общего назначения (stdlib.h) содержит еще две других функции динамического выделения памяти: calloc и realloc. Эти функции могут использоваться для создания и изменения размера динамических массивов. Как было показано в главе 5, Указатели и строки , указатель на массив может индексироваться, подобно тому, как индекс используется с именем массива. Аналогично указателем на непрерывный в памяти объект, созданный при помощи функции calloc, можно пользоваться как массивом. Функция calloc динамически выделяет память под массив. Прототип функции calloc выглядит следующим образом: void *calloc(size t nmemb, size t size); Функция получает два параметра: число элементов (nmemb) и размер каждого элемента (size). Элементам массива присваиваются нулевые начальные значения. Функция возвращает указатель на выделенную память, или нулевой указатель (0), если память не выделена. Функция realloc изменяет размер объекта, память под который была выделена предыдущим обращением к функциям malloc, calloc или realloc. Содержимое объекта не изменяется при условии, что выделяемый объем памяти больше, чем предыдущий размер массива. В противном случае содержимое не изменяется только в пределах нового размера объекта. Прототип функции realloc имеет следующий вид void *realloc(void *ptr, size t size);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |