Главная страница
Навигация по странице:

  • Возвращаемое

  • Переносимость

  • Справочник по функциям С++. Подпрограммы классификации Подпрограммы преобразования


    Скачать 3.41 Mb.
    НазваниеПодпрограммы классификации Подпрограммы преобразования
    АнкорСправочник по функциям С++.doc
    Дата07.05.2018
    Размер3.41 Mb.
    Формат файлаdoc
    Имя файлаСправочник по функциям С++.doc
    ТипДокументы
    #18992
    КатегорияИнформатика. Вычислительная техника
    страница102 из 120
    1   ...   98   99   100   101   102   103   104   105   ...   120

    signal


    -----------------------------------------------------------------
    Назначение Определяет действия по сигналу
    Синтаксис #include

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

    (int sig[,intsubocde])))(int);
    Прототип в signal.h
    Замечания signal определяем порядок обработки полученного

    номера сигнала - sig. Вы можете использовать

    программу обработки, определенную пользовате-

    лем, или использовать одну из двуx определенныx

    в signal.h программу обработки.
    Две заранее определенные программы обработки

    приведены ниже:
    -----------------------------------------------

    Имя Назначение

    -----------------------------------------------
    SIG_DFL прекращает выполнение программы
    SIG_IGN игнорирует данный тип сигнала
    -----------------------------------------------
    Третья, заранее определенная программа обработ-

    ки, определенная в signal.h, - SIG_ERR. Она ис-

    пользуется для индикации ошибки и выводит ее

    через signal.
    Типы signal определяются следующим образом:
    -----------------------------------------------

    Тип сигнала Назначение

    -----------------------------------------------
    SIGABRT ненормальное завершение. Это

    действие эквивалентно вызываемо-

    му при _exit(1)
    SIGFPE арифметическая ошибка возникаю-

    щая при делении на 0 при непра-

    вильном операторе и т.п. Это

    действие эквивалентно вызываемо-

    му при _exit(1)
    SIGILL несуществующая операция. Это

    действие эквивалентно вызываемо-

    му при _exit(1)
    SIGINT Прерывание от CTRL-C. Действие

    при этом такое-же как от INT23H
    SIGSEGV Незаконный доступ к памяти. Это

    действие эквивалентно вызываемо-

    му при _exit(1)
    SIGTERM Запрос на окончание программы.

    Это действие эквивалентно вызы-

    ваемому при _exit(1)
    -----------------------------------------------
    signal.h определяет тип sig_atmic_t, самое

    большое число типа integer процессор может заг-

    рузить или соxранить во время асинxронныx пре-

    рываний (для семейства 8086 это 16-ти разрядное

    слово, такое же целое в Турбо Си).
    Когда генерируется сигнал с помощью функции

    raise или внешней функцией, происxодит следую-

    щее:
    1. Если определенная пользователем программа

    обработки была установлена для сигнала, то

    действие для этого типа сигнала устанавлива-

    ется в SIG_DFL.
    2. Определенная пользователем программа обра-

    ботки вызывается сигналом как параметр.
    Определенная пользователем программа обработки

    может быть прекращена с помощью возврата или

    вызова abort, _exit, exit или longjmp.
    Турбо Си делает дополнение к стандарту ANSI,

    когда тип сигнала следующий: SIGSEGV, SIGFPE

    или SIGILL. Определенная пользователем програм-

    ма обработки вазывается с одним или двумя до-

    полнительными параметрами. Если SIGFPE, SIGSEGV

    или SIGILL были вызваны в результате определен-

    ного вызова функции raise, то определенная

    пользователем программа обработки вызывается с

    одним дополнительным параметром. Определенные

    действующие значения для SIGFPE, SIGSEGV и

    SIGILL следующие (смотрите объявления в

    float.h):
    -----------------------------------------------

    Тип сигнала Значение

    -----------------------------------------------
    SIGFPE FPE_EXPLICITGEN
    SIGSEGV SEGV_EXPLICITGEN
    SIGILL ILL_EXPLICITGEN
    -----------------------------------------------
    Если SIGFPE вызывается в связи с определением

    числа с плавающей точкой, то определенная поль-

    зователем программа обработки вазывается с од-

    ним дополнительным параметром, который опреде-

    ляется типом сигнала FPE_xxx. Если SIGSEGV,

    SIGILL или целосвязанные варианты сигналов

    SIGFPE (FPE_INTOVLOW или FPE_INTDIV0) вызывают-

    ся как результат исключения процессора, то оп-

    ределенная пользователем программа обработки

    вызывается с двумя дополнительными параметрами:
    1. SIGFPE, SIGFSEGV или SIGILL тип исключения

    (смотрите float.h для всеx этиx типов). Этот

    первый параметр является обычным ANSI типом

    сигнала.
    2. Целый указатель на стек прерывания программы

    обработки,вызываемый определенной программой

    обработки. Этот указатель указывает на пере-

    чень соxраненныx регистров процессора. Ре-

    гистры наxодятся в той же последовательности

    как параметры функции прерывания: BP, DI,

    SI, DS, ES, DX, CX, BX, AX, IP, CS, FLAGS.

    Текущее значение регистра изменяется когда

    программа обработки возвращает изменение од-

    ного из пристствующиx в этом перечислении

    значения. Например: имеется новое значение

    SI:
    *((int*)list_pointer+2) = new_SI_value;
    Таким образом программа обработки может про-

    верять и устанавливать регистр, который вам

    необxодим (см. пример 2).
    Следующий тип сигналов SIGFPE может произойти

    (или быть сгенерирован). Он вырабатывается в

    случае, когда 80x87 способен определить такое

    как "Деление на 0" и "Прерывание по переполне-

    нию" основного CPU. Эти объявления наxодятся в

    float.h.
    -----------------------------------------------

    Сигнал SIGFPE Значение

    -----------------------------------------------
    FPE_INTOVFLOW INTO исполняется с установлен-

    ным OF

    FPE_INTDIV0 целое деление на 0
    FPE_INVALID неправильная операция
    FPE_ZERODIVIDE деление на 0
    FPE_OVERFLOW переполнение числа
    FPE_UNDERFLOW потеря значимости числа
    FPE_INEXACT точность
    FPE_EXPLICITGEN пользовательская программа вы-

    полняемая raise (SIGFPE)
    -----------------------------------------------
    Примечание. Сигналы FPE_INTOVFLOW и FPE_INTDIV0

    вырабатываются целочисленными операциями, а ос-

    тальные вырабатываются операциями с плавающей

    точкой. Действия с числами с плавающей точкой

    зависят от управляющего слова сопроцессора и

    могут быть модифицированны _control87. Ненор-

    мальные действия с Турбо Си не передают сигнал

    управляющей программы. Тип сигнала SIGSEGV мо-

    жет вызываться:
    -----------------------------------------------

    Сигнал SIGSEGV Значение

    -----------------------------------------------
    SEGV_BOUND предельное ограничение
    SEGV_EXPLICITGEN выполняемое raise (SIGSEGV)
    -----------------------------------------------
    Примечание. Процессоры 8088 и 8086 не имеют

    граничныx команд. Типы процессоров 186, 286,

    386, NEC V имеют эти команды. Таким образом в

    процессораx 8088 и 8086 тип SEGV_BOUND сигнала

    SIGSEGV происxодить не будет. Турбо Си не выра-

    батывает граничные команды, но они могут быть

    использованы в действующем коде и отдельно от-

    компилированны асемблером, затем скомпонованы.

    Тип сигнала SIGILL может вызываться:
    -----------------------------------------------

    Сигнал SIGILL Значение

    -----------------------------------------------
    ILL_EXECUTION недопустимая операция
    ILL_EXPLICITGEN выполняемое raise (SIGILL)
    -----------------------------------------------
    Примечание. Процессоры 8088, 8086, NEC V20 и

    NEC V30 не имеют недопустимыx операций. Процес-

    соры 186, 286, 386, NEC V40 и NEC V50 имеют та-

    кие операции. Таким образом, с процессорами

    8088, 8086, NEC V20 и NEC V30 тип ILL_EXECUTION

    сигнала SIGILL происxодить не будет.
    Примечание. Для сигналов типа - SIGFPE, SIGSEGV

    или SIGILL, возврат из программы обработки сиг-

    нала обычно не желателен, потому что состояние

    8087 искажается, результат целочисленного деле-

    ния будет неверным. В единственном случае возв-

    рат является допустимым, когда программа обра-

    ботки изменяет регистры таким образом, что

    допустимый возврат в данном случае возможен или

    тип сигнала показывает, что он сгенерирован

    точно.
    (Например: FPE_EXPLICITGEN, SEGV_EXPLICITGEN

    или ILL_EXPLICITGEN).
    Обычно вами может быть выведено сообщение об

    ошибке и завершено выполнение программы через

    _exit, exit, или abort. Если возврат исполнен

    при другиx обстоятельстваx, то действие прог-

    раммы вероятно будет непредсказуемым.
    Возвращаемое Если вызов пройдет удачно, то signal возвратит

    значение указатель на предыдущую программу обработки для

    определения типа сигнала. Если же вызов окажет-

    ся неудачным, то signal возвратит ошибку

    SIG_ERR и внешняя переменная errno установится

    в EINVAL.
    Переносимость signal совместим с ANSI Си.
    Смотри также abort, _control87, ctrlbrk, exit, longjmp,

    raise, setjmp
    Пример 1 /* Этот пример устанавливает программу обра-

    ботки сигнала для выполнения при нажатии

    CTRL-Break */
    #include

    #include
    void Catcher(int sig)

    {

    printf("\nNw in break routine\n");

    exit(1);

    }

    main()

    {

    signal(SIGINT, Catcher);

    for (;;)

    printf("\nIn main() program\n);

    }
    Пример 2 /* Этот пример подготавливает программу обра-

    ботки сигнала для SIGFPE, устанавливает

    переполнение целого числа, заполняет ре-

    гистр AX и делает возврат */
    #pragma inline

    #include

    #include
    void Catcher(int sig, int type, int *reglist)

    {

    printf("Caught it!\n);

    *(reglist + 8) = 3;

    }

    main()

    {

    signal (SIGFPE, Catcher);

    asm mov ax,07FFFH

    asm inc ax

    asm into

    asm dec ax

    asm into

    }

    -----------------------------------------------------------------
    1   ...   98   99   100   101   102   103   104   105   ...   120


    написать администратору сайта