Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Оператор
breakawkTAG_BREAKlongjmp()continueawkTAG_CONTINUEeval.c657 case Node_K_break:658 INCREMENT(tree->exec_count); /* ... */675 longjmp(loop_tag, TAG_BREAK);676 break;677678 case Node_K_continue:679 INCREMENT(tree->exec_count); /* ... */696 longjmp(loop_tag, TAG_CONTINUE);670 break;Вы можете думать о
setjmp()longjmp()goto12.5.2. Обработка масок сигналов:
sigsetjmp()siglongjmp()По историческим причинам, которые, скорее всего, утомили бы вас до слез, стандарт С 1999 г. ничего не говорит о влиянии
setjmp()longjmp()Другими словами, если программа изменяет свою маску сигналов процесса между первым вызовом
setjmp()longjmp()longjmp()setjmp()Чтобы сделать обработку маски сигналов процесса явной, POSIX ввел две дополнительные функции и один
typedef#include <setjmp.h> /* POSIX */int sigsetjmp(sigjmp_buf env, int savesigs); /* Обратите внимание: sigjmp_buf, не jmp_buf! */void siglongjmp(sigjmp_buf env, int val);Главным отличием является аргумент
savesigssigsetjmp()envsetjmp()siglongjmp()envsavesigsЗАМЕЧАНИЕ. POSIX также ясен в том, что если
savesigssetjmp()longjmp()sigsetjmp(env, 0)12.5.3. Важные предостережения
Есть несколько технических предостережений, о которых нужно знать.
Во-первых, поскольку сохранение и восстановление среды может быть беспорядочной машинно-зависимой задачей,
setjmp()longjmp()Во-вторых, стандарт С ограничивает использование
setjmp()• В качестве единственного контролирующего выражения в операторе цикла или условном операторе (
ifswitch• В качестве одного операнда выражения сравнения (
==<• В качестве операнда унарного оператора '
!• В качестве всего выражения оператора-выражения, возможно, приведенного к типу
void(void)setjmp(buf);В-третьих, если вы хотите изменить локальную переменную в функции, которая вызывает
setjmp()longjmp()volatilevolatilesetjmp()jmp_bufvolatile1 /* ch12-setjmp.с --- демонстрирует setjmp()/longjmp() и volatile. */23 #include <stdio.h>4 #include <setjmp.h>56 jmp_buf env;78 /* comeback --- выполнение longjmp */910 void comeback(void)11 {12 longjmp(env, 1);13 printf("This line is never printedn");14 }1516 /* main - вызов setjmp, действия с переменными, вывод значений */1718 int main(void)