Язык программирования Си. Издание 3-е, исправленное - Брайан Керниган
Шрифт:
Интервал:
Закладка:
if (setjmp() == 0)
/* после прямого возврата */
else
/* после возврата из longjmp */
void longjmp(jmp_buf env, int val);
longjmp восстанавливает информацию, сохраненную в самом последнем вызове setjmp, по информации из env; выполнение программы возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val. Результат будет непредсказуемым, если в момент обращения к longjmp функция, содержащая вызов setjmp, уже "отработала" и осуществила возврат. Доступные ей объекты имеют те значения, которые они имели в момент обращения к longjmp; setjmp не сохраняет значений.
B9. Сигналы: <signal.h>
Заголовочный файл <signal.h> предоставляет средства для обработки исключительных ситуаций, возникающих во время выполнения программы, таких как прерывание, вызванное внешним источником или ошибкой в вычислениях.
void (*signal(int sig, void (*handler)(int)))(int)
signal устанавливает, как будут обрабатываться последующие сигналы. Если параметр handler имеет значение SIG_DFL, то используется зависимая от реализации "обработка по умолчанию"; если значение handler равно SIG_IGN, то сигнал игнорируется; в остальных случаях будет выполнено обращение к функции, на которую указывает handler с типом сигнала в качестве аргумента. В число допустимых видов сигналов входят:
SIGABRT аварийное завершение, например от abort; SIGFPE арифметическая ошибка: деление на 0 или переполнение; SIGILL неверный код функции (недопустимая команда); SIGINT запрос на взаимодействие, например прерывание; SIGSEGV неверный доступ к памяти, например выход за границы; SIGTERM требование завершения, посланное в программу.signal возвращает предыдущее значение handler в случае специфицированного сигнала, или SIGERR в случае возникновения ошибки.
Когда в дальнейшем появляется сигнал sig, сначала восстанавливается готовность поведения "по умолчанию", после чего вызывается функция, заданная в параметре handler, т.е. как бы выполняется вызов (*handler)(sig). Если функция handler вернет управление назад, то вычисления возобновятся с того места, где застал программу пришедший сигнал. Начальное состояние сигналов зависит от реализации.
int raise(int sig)
raise посылает в программу сигнал sig. В случае неудачи возвращает ненулевое значение.
B10. Функции даты и времени: ‹time.h›
Заголовочный файл <time.h> объявляет типы и функции, связанные с датой и временем. Некоторые функции имеют дело с местным временем, которое может отличаться от календарного, например в связи с зонированием времени. Типы clосk_t и time_t - арифметические типы для представления времени, a struct tm содержит компоненты календарного времени:
int tm_sec; - секунды от начала минуты (0,61); -- I.B.: все же наверно от 0 до 59
int tm_min; - минуты от начала часа (0,59);
int tm_hour; - часы от полуночи (0,23);int tm_mday; - число месяца (1,31);
int tm_mon; - месяцы с января(0,11);
int tm_year; - годы с 1900;
int tm_wday; - дни с воскресенья (0,6);
int tm_yday; - дни с 1 января (0,365);
int tm_isdst; - признак летнего времени.
Значение tm_isdst - положительное, если время приходится на сезон, когда время суток сдвинуто на 1 час вперед, нуль в противном случае и отрицательное, если информация не доступна.
clock_t clock(void)
clock возвращает время, фиксируемое процессором от начала выполнения программы, или -1, если оно не известно. Для выражения этого времени в секундах применяется формула clock()/CLOCKS_PER_SEC.
time_t time(time_t *tp)
time возвращает текущее календарное время (т. е. время, прошедшее после определенной даты, - обычно после 0 ч 00 мин 00 с GMT 1-го января 1970 г. - примеч. ред.) или -1, если время не известно. Если tp не равно NULL, то возвращаемое значение записывается и в *tp.
double difftime(time_t time2, time_t time1)
difftime возвращает разность time2 - time1, выраженную в секундах.
time_t mktime(struct tm *tp)
mktime преобразует местное время, заданное структурой *tp, в календарное, выдавая его в том же виде, что и функция time. Компоненты будут иметь значения в указанных диапазонах. Функция mktime возвращает календарное время или -1, если оно не представимо.
Следующие четыре функции возвращают указатели на статические объекты, каждый из которых может быть изменен другими вызовами.
char *asctime(const struct tm *tp)
asctime переводит время в структуре *tp в строку вида
Sun Jan 3 15:14:13 1988n
char *ctime(const time_t *tp)
ctime переводит календарное время в местное, что эквивалентно выполнению asctime(localtime(tp))
struct tm *gmtime(const time_t *tp)
gmtime переводит календарное время во Всемирное координированное время (Coordinated Universal Time - UTC). Выдаст NULL, если UTC не известно. Имя этой функции, gmtime, происходит от Greenwich Mean Time (среднее время по Гринвичскому меридиану).
struct tm *localtime(const time_t *tp)
localtime переводит календарное время *tp в местное.
size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp)
strftime форматирует информацию о дате и времени из *tp в строку s согласно формату fmt, который имеет много общих черт с форматом, задаваемым в функции printf. Обычные символы (включая и завершающий символ ' ') копируются в s. Каждая пара, состоящая из % и буквы, заменяется, как показано ниже, с использованием значений по форме, соответствующей местным традициям. В s размещается не более smax символов; strftime возвращает число символов без учета ' ' или нуль, если число сгенерированных символов больше smax.
%a сокращенное название дня недели %A полное название дня недели %b сокращенное название месяца %B полное название месяца %c местное представление даты и времени %d день месяца (01-31) %H час (24-часовое время) (00-23) %I час (12-часовое время) (01-12) %j день от начала года (001-366) %m месяц (01-12) %M минута (00-59) %p местное представление AM или РМ (до или после полудня) %S секунда (00-61) %U неделя от начала года (считая, что воскресенье - 1-й день недели) (00-53) %w день недели (0-6, номер воскресенья - 0) %W неделя от начала года (считая, что понедельник - 1-й день недели) (00-53) %x местное представление даты %X местное представление времени %y год без указания века (00-99) %Y год с указанием века %Z название временной зоны, если она есть %% %B11. Зависящие от реализации пределы: <limits.h> и <float.h>
Заголовочный файл <limits.h> определяет константы для размеров целочисленных типов. Ниже перечислены минимальные приемлемые величины, но в конкретных реализациях могут использоваться и большие значения.
CHAR_BIT 8 битов в значении char SCHAR_MAX UCHAR_MAX или SCHAR_MAX максимальное значение char CHAR_MIN 0 или SCHAR_MIN минимальное значение char INT_MAX +32767 максимальное значение int INT_MIN -32767 (I.B.:обычно это значение -32768) минимальное значение int LONG_MAX +2147463647 максимальное значение long LONG_MIN -2147483647 (I.B.:обычно это значение -2147483648) минимальное значение long SCHAR_MAX +127 максимальное значение signed char SCHAR_MIN -127 (I.B.:обычно это значение -128) минимальное значение signed char SHRT_MAX +32767 максимальное значение short SHRT_MIN -32767 (I.B.:обычно это значение -32768) минимальное значение short UCHAR_MAX 255 максимальное значение unsigned char UINT_MAX 65535 максимальное значение unsigned int ULONG_MAX 4294967295 максимальное значение unsigned long USHRT_MAX 65535 максимальное значение unsigned shortИмена, приведенные в следующей таблице, взяты из <float.h> и являются константами, имеющими отношение к арифметике с плавающей точкой. Значения (если они есть) представляют собой минимальные значения для соответствующих величин. В каждой реализации устанавливаются свои значения.