|
Программирование >> Структурное программирование
операнд операции проверки на равенство или отношения в случае, когда второй операнд является целочисленным константным выражением, а все выражение в целом является выражением условия в операторах выбора или цикла; операнд унарной операции !, если при этом все выражение в целом является выражением условия в операторах выбора или цикла; оператор выражения в целом. void longjmp (jmp buf env, int val); Эта функция восстанавливает окружение, которое было сохранено в соответствующем объекте типа jmp buf при последнем вызове макроса setjmp в пределах той же функции, из которой вызывается longjmp. Если такой вызов setjmp не был сделан или если функция, содержащая вызов setjmp, уже завершила свое выполнение, поведение функции longjmp не определено. Все доступные объекты восстанавливают свои значения, которые они имели во время вызова longjmp, за исключением автоматических объектов, локальных для функции, из которой вызывался соответствующий макрос setjmp, и которые не определены со спецификатором volatile и были изменены между вызовами setgmp и longjmp - значения таких объектов не определены. Хотя longjmp обходит обычные механизмы вызова функции и возврата из функции, longjmp работает корректно в контексте прерываний, сигналов и функций, связанных с ними. Однако, если функция longjmp вызывается из вложенного обработчика сигналов (то есть из функции, вызванной в результате сигнала, посланного во время обработки другого сигнала), то ее поведение не определено. После завершения longjmp выполнение программы продолжается так, как если бы соответствующий вызов макроса setjmp возвратил значение, определяемое параметром val. Функция longjmp не может заставить макрос setjmp вернуть значение 0; если val равно О, setjmp возвратит значение 1. А.8. Обработка сигналов <signal.h> sig atomic t Целочисленный тип, объекты которого доступны даже при асинхронных прерываниях. SIG DFL SIG ERR SIG IGN Это символические константы (см. описание функции signal, поясняющее их смысл), тип которых совместим с типом второго параметра и возвращаемого значения функции signal и значения которых не должны совпадать с адресом ни одной из объявленных функций. Каждая из констант принимает положительное целочисленного значение, представляющее номер сигнала соответствующего типа: SIGABRT аварийное завершение программы, например в результате вы- зова функции abort SIGFPE ошибочная арифметическая операция, например, операция де- ления на нуль или операция, вызвавшая переполнение SIGILL обнаружение ошибочного образа функции, например, недопус- тимой команды SIGINT получение интерактивного сигнала void (*signal(int sig, void (*func) (int) ) ) (int); Функция определяет один из трех возможных способов реакции на получение сигнала с номером sig. Если для параметра func используется значение SIG DFL, то для такого сигнала будет использоваться обработка по умолчанию. Если значение func равно SIG IGN, то сигнал будет игнорироваться. В остальных случаях, параметр func должен указывать на функцию, которая вызывается для обработки сигнала. Такая функция называется обработчиком сигнала. Если func указывает на функцию, то при возникновении сигнала сначала выполняются действия, эквивалентные вызову signal(sig, SIG DFL); , т.е. происходит перехват сигнала обработчиком системы по умолчанию. (Если значение sig равно SIGILL, то будет или не будет вызываться обработчик по умолчанию зависит от реализации системы.) После этого выполняется вызов (* func) (sig);. Выполнение функции func может завершаться оператором return или вызовом функций abort, exit или longjmp. Если функция func завершается оператором return и при этом значение параметра sig равно SIGFPE или любому другому определяемому реализацией значению, соответствующему исключению, связанному с ошибкой в вычислениях, то результат не определен. В остальных случаях, программа продолжит выполнение с точки, в которой произошло прерывание. В случае, если сигнал посылается не в результате вызова функций abort и raise, то результат не определен, если обработчик сигнала вызывает любую функцию из стандартной библиотеки, кроме функции signal (со значением передаваемого в первом аргументе номера сигнала, соответствующего сигналу, который вызвал обработчик) или обращается к любому объекту типа static, если только он не объявлен как тип volatile sig atomic t. Кроме того, если такой вызов функции signal завершается возвратом значения SIG ERR, то значение еггпо не определено. При запуске системы, могут выполняться действия, эквивалентные вызовам signal (sig, SIG IGN); для некоторого набора сигналов, установленных в данной системе программирования; для всех остальных сигналов, определенных в реализации системы, выполняются операции, эквивалентные вызовам signal (sig, SIG DFL); Если запрос на обработку сигнала завершился успешно, то функция signal возвращает значение func, переданное функции signal в самом последнем обращении к ней для данного номера сигнала sig. В противном случае, возвращается значение SIG ERR и еггпо присваивается положительное значение. int raise(int sig); Функция raise посылает сигнал sig выполняющейся программе. В случае успеха функция raise возвращает нуль, в случае неудачи - ненулевое значение. SI6SE6V ошибка обращения к памяти SIGTERM посланный программе запрос о завершении работы Программа не должна генерировать ни один из этих сигналов иначе, как явным вызовом функции raise. А.9. Работа с функциями с переменным числом аргументов <stdarg.h> va list Тип, предназначенный для хранения информации, необходимой макросам va start, va arg и va end. Для того, чтобы использовать возможность вызова функции с переменным числом аргументов, вызываемая функция должна объявлять объект типа va list, называемый в этом разделе ар. Объект ар может быть передан в качестве аргумента другой функции; если эта функция вызывает макрос va arg с аргументом ар, то в вызывающей функции значение ар должно быть определено и в дальнейшем передано макросу va end. void va 8tart(va list ар, parmN) ; Этот макрос должен вызываться перед обработкой списка с переменным числом параметров в вызове функции. Макрос va start инициализирует объект ар для последующего использования макросами va arg и va end. Параметр parmN задает имя самого правого из определенных параметров в списке в объявлении функции (это тот параметр, за которым сразу следует многоточие ...). Если параметр parmN объявлен с классом памяти register, или имеет тип функции или массива, или несовместим с типом, получаемым в результате определяемого по умолчанию продвижения параметров по шкале типов, то поведение макроса не определено. type va arg(va list ар, type); Макрос, расширяющийся до выражения, которое имеет тип и значение следующего параметра в списке. Параметр ар должен быть тем самым ар, который был инициализирован макросом va start. Каждый вызов va arg изменяет значение ар таким образом, чтобы в следующем вызове va arg возвращалось значение следующего параметра. Параметр type задает имя типа ожидаемого параметра из списка параметров; это имя, за которым следует символ звездочки (*), используется для формирования указателя нужного типа, ссылающегося на очередной объект в списке параметров. Если параметров больше нет или если type несовместим с типом следующего параметра (в результате задаваемого по умолчанию приведения типов), то результат не определен. В первом после вызова va start вызове макроса va arg возвращается значение параметра, следующего за параметром, определенным в parmN. Все остальные вызовы va arg последовательно возвращают значения оставшихся параметров. void va end(va list ар); Обеспечивает нормальный возврат из функции, в которой осуществлялась работа со списком параметров переменной длины путем создания макросом va start объекта ар типа va list. Макрос va end может изменять объект ар таким образом, что он не будет больше пригоден для использования (пока не будет сделан новый вызов va start). Если не был сделан соответствующий вызов va start или перед возвратом из функции не был вызван va end, то результат обработки списка параметров не определен.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |