Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Оператор
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)
