Описание функций Си


         

и NEC V30 не имеют


Замечание: 8088, 8086, NEC V20 и NEC V30 не имеют исключительной ситуации по неверной инструкции. 186, 286, 386, NEC V40 и NEC V50 имеют эту ситуа- цию. Т.о. при работе с процессорами 8088, 8086, NEC V20 и NEC V30 сигнал типа ILL_EXECUTION воз- никнуть не может.

Замечание. Если тип сигнала SIGFPE, SIGSEGV или SIGILL, то возврат из программы обработки сигнала не желателен, т.к. состояние 8087 нарушено, ре- зультат целочисленного деления неверен, возникло переполнение, граничная операция ошибочна, или была попытка выполнить несуществующую операцию. Возврат может происходить только в том случае, если программа обработки сигналов изменила регис- тры так, что существует корректный контекст возв- рата, или если сигнал был генерирован с помощью raise, напрмер FPE_EXPLICITGEN, SEGV_EXPLICITGEN или ILL_EXPLICITGEN. В основном, в этом случае нужно печатать сообщение и завершать выполнение программы с помощью _exit, exit или abort. Если возврат осуществляется при другом состоянии, то в этом случае результаты дальнейшей работы програм- мы непредсказуемы.

Возвращаемое При успешном завершении signal возвращае указатель значение на старую программу обработки сигнала для данного типа сигналов. При ошибке signal возвращает SIG_ERR и присваивает переменной errno значение EINVAR.

Переносимость signal поддерживается стандартом ANSI C.

Смотрите также 7,

Пример:

/* В этом примере загружается программа обработки сигнала, возникающего при нажатии Ctrl-Break */

#include

#include

#include

void Cather(int sig) { printf("\n Теперь программа обработки Break"); exit(1); }

int main(void) { signal(SIGINT,Cather); for(;;) printf("\n Сейчас основная программа \n"); }

Пример 2:

/* В этом примере загружается программа обработки сигналов SIGFPE, которая отлавливает состояние переполнения при выполнении целочисленных опе- раций, восстанавливает нормальное значение в АХ и возвращает управление */

#pragma inline #include

#include

void Catcher(int sig, int type, int *reglist) { printf("Поймал!\n"); *(reglist+8)=3; /* AX = 3 */ }

int main(void) { signal(SIGFPE,Catcher); asm mov ax,07FFFH /* AX = 32767 */ asm inc ax /* вызвать перепол- нение */ asm into /* активизировать программу */

/* при возврате управления программа обработки сигнала заносит в AX значение 3. Если этого не сделать, то в следующей операции опять вызовет into (после dec) */

asm dec ax /* нет перепол. */ asm into /* не активизир. */ }


Содержание  Назад  Вперед