CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по библиотечным функциям языка Си
Interrupt - package пакет работы с прерываниями
Описание
Пакет работы с прерываниями спроектирован как общецеле- вой пакет по управлению прерываниями 8086. Для каждого вектора прерываний можно определить новую реакцию. C функция, обрабатывающая прерывание, определяет, свя- зано ли прерывание с прежним вектором прерывания или нет. int_intercept связывает стандартную C - функцию (*funcptr) с вектором прерывания для обработки данного прерывания при его появлении. Параметр vector опре- деляет вектор прерывания 8086 (0...255), с которым свя- зывается функция. Аргумент stacksize определяет количе- ство байтов памяти, отводимой под стек для функции об- работки. Размер стека должен быть не менее 256 байтов. Если функция обработки прерывания (*funcptr)() возв- ратит нулевое значение, то будет вызвана прежняя функ- ция обработки прерывания, cвязанная с этим вектором, иначе выполнится возврат из прерывания. Значения из регистров могут быть считаны или записаны через указатель (*pd) на структуру INT_DATA, который поступает к (*funcptr)(). Существует несколько правил, которым необходимо следовать, занимаясь обработкой пре- рываний на C: 1). Ни MS DOS, ни BIOS не могут быть вызваны в про- цессе обработки прерывания, если при этом может произойти прерывание. Это объясняется тем, что MS DOS и BIOS не являются повторно входимыми. 2). Нельзя при обработке прерывания или в вызванной отсюда функции использовать в стеке памяти боль- ше, чем отведено под стек. 3). Не обращайтесь к какой-либо функции, не являю- щейся повторно входимой. (Результат будет непредсказуем). 4). Непозволительно выполнение операций ввода/вы- вода в обработке прерывания. 5). Когда используются переменные, изменяемые при обработке прерывания, объявляйте их как `volatile'. 6). Отключите для функции обработки прерывания конт- роль переполнения стека. int_off выключает прерывания 8086 командой CLI (clear interrupt flag). int_on включает прерывание 8086 командой STI (set interrupt flag). Функция int_restore является обратной к int_intercept. int_restore отключает первоначальный обработчик преры- ваний, который был подцеплен к указанному вектору пос- редством int_intercept. Поэтому int_restore не должна вызываться до обращения к int_intercept, связывающего (новую) реакцию с этим вектором прерываний. int_getvector получает содержимое указанного вектора прерываний, разлагает его на сегмент и смещение и запо- минает их в переменных psegment и poffset. int_setvector устанавливает адрес пользовательской процедуры, используя offset и segment, в указанном векторе прерываний.
Использование
#include <int.h> void int_getvector(unsigned vector, unsigned *poffset, unsigned *psegment); int int_intercept(unsigned vector, int (*funcptr) (struct INT_DATA *pd), unsigned stacksize); void int_off(void); void int_on(void); int int_restore(unsigned vector); void int_setvector(unsigned vector, unsigned offset, unsigned segment);
Возвращаемое значение
Значение, возвращаемое int_intercept и int_restore, индицирует успех или неудачу. 0 возвращается в случае успеха и -1 в противном случае. ПРЕДУПРЕЖДЕНИЕ: Переопределение прерывания является тонкой процедурой, требующей хоро- шего понимания MS DOS и семейства IBM PC для успешного применения.
Пример
#include <int.h> volatile int ctrl_c_count = 0; int do_ctrl_c(); main() { int_intercept(0х23, do_ctrl_c, 256); /* установили реакцию */ while(ctrl_c_count<3) printf("Число Ctrl C равно %d/n", ctrl_c_count); int_restore(0х23); /* восстановили старую */ } do_ctrl_c() { ++ctrl_c_count; return 1; }