mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

SETJMP(3C)                                           SETJMP(3C)

НАЗВАНИЕ 
        setjmp, longjmp - нелокальная передача управления

СИНТАКСИС 
        #include 
        
        int setjmp (env)
        jmp_buf env;
        
        void longjmp (env, val)
        jmp_buf env;
        int val;

ОПИСАНИЕ 
        Описываемые функции полезны при обработке ошибок и пре-
        рываний, случившихся на одном из нижних  уровней  прог-
        раммной системы.

        Функция  setjmp  сохраняет текущее стековое окружение в
        массиве env (тип jmp_buf определен во включаемом  файле
        )  для  последующего  использования  функцией
        longjmp. Результат функции setjmp равен 0.

        Функция  longjmp восстанавливает окружение, сохраненное
        при последнем вызове setjmp с соответствующим  аргумен-
        том  env. После завершения longjmp выполнение программы
        продолжается  так,  как  будто  соответствующий   вызов
        setjmp  только  что вернул значение val. Отметим, что в
        промежутке между обращениями  к  setjmp  и  longjmp  не
        должно быть возврата из функции, вызывавшей setjmp.

        С помощью функции longjmp  невозможно  вернуть  нулевое
        значение. Если при вызове longjmp аргумент val равен 0,
        setjmp  все  равно вернет 1. Тем самым всегда есть воз-
        можность  отличить  естественный  возврат  из   функции
        setjmp от искусственного, ставшего результатом выполне-
        ния longjmp. Значения всех глобальных объектов в момент
        искусственного  возврата из setjmp, естественно, те же,
        что и в момент вызова longjmp. Значения локальных  объ-
        ектов   соответствуют   экземпляру  функции,  вызвавшей
        setjmp.

ПРИМЕР 
        #include 
        
        jmp_buf env;
        int i=0;
        main ()
        {
          void exit ();
        
          if (setjmp (env) != 0) {
            (void) printf (
             "Значение i при 2-ом возврате из setjmp: %d\n",i);
            exit (0);
          }
          (void) printf (
           "Значение i при 1-ом возврате из setjmp: %d\n",i);
          i = 1;
          g();
          /* Недостижимый фрагмент */
        }

        g()
        {
          longjmp (env, 1);
          /* Недостижимый фрагмент */
        }

        Результаты выполнения этой программы после компиляции с
        языка C будут следующими:

             Значение i при 1-ом возврате из setjmp: 0
             Значение i при 2-ом возврате из setjmp: 1

СМ. ТАКЖЕ 
        signal(2).

ПРЕДОСТЕРЕЖЕНИЯ 
        Если  при  обращении к функции longjmp передается аргу-
        мент env, не заполненный setjmp,  или  последний  вызов
        setjmp был в функции, из которой уже произошел возврат,
        то Вам гарантируется абсолютный хаос.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк