DODATEK B BIBLIOTEKA STANDARDOWA
DODATEK B BIBLIOTEKA STANDARDOWA
Deklaracje zawarte w <setjmp.h> dostarczają mechanizmu pozwalającego ominąć normalny ciąg wywołań funkcji i powrotów, zwykle po to, aby umożliwić bezpośredni powrót z głęboko zagnieżdżonych wywołań funkcji.
int setjmp(jmp_buf env)
Funkcja setjmp zachowuje w env informacje o stanie programu, wykorzystywane później przez funkcję longjmp. Bezpośrednio wywołana funkcja setjmp zwraca zero; wartość różną od zera otrzymuje się w wyniku późniejszego wywołania funkcji longjmp. Wywołania funkcji setjmp mogą wystąpić tylko w niektórych kontekstach - w zasadzie tylko w testach instrukcji if, switch i pętli, a i tu w niezbyt skomplikowanych wyrażeniach relacyjnych.
if (setjmp(env) == 0)
/* wchodzi tu przy bezpośrednim wywołaniu */ else *
/* wchodzi tu po wywołaniu longjmp */
void longjmp(jmp_buf env, int val)
Funkcja longjmp przywraca stan programu zapamiętany w zmiennej env przez ostatnie wywołanie funkcji setjmp, a wykonanie programu wznawia się w taki sposób, jakby właśnie wykonano funkcję setjmp, która wróciła z wartością val różną od zera. Funkcja zawierająca wywołanie setjmp nie może się zakończyć przed wywołaniem longjmp. Dostępne obiekty mają takie wartości, jakie miały w chwili wywołania longjmp, z tym że wartości zmiennych automatycznych nie-volatile nie są zdefiniowane, jeśli uległy zmianie po wykonaniu setjmp.
Nagłówek <signal.h> dostarcza mechanizmów do obsługi zdarzeń wyjątkowych, które mogą zajść podczas wykonywania programu. Takimi zdarzeniami są np. sygnał przerwania, nadesłany z zewnątrz programu, lub błąd w wykonaniu programu.
void (*signal(int sig, void (*handler) (int))) (int)
Funkcja signal rozstrzyga, w jaki sposób będą obsługiwane nadchodzące sygnały. Jeśli argument handler ma wartość SIG-DFL, podejmuje się domyślną akcję zależną od implementacji; jeśli ma wartość SIG_IGN, to sygnał będzie ignorowany; w pozostałych przypadkach wywołuje się wskazaną przez niego funkcję z podanym rodzajem sygnału. Oto niektóre z możliwych sygnałów:
B10 OBSŁUGA DATY I CZASU: NAGŁÓWEK <TIME.H>
SIGABRT nienormalne zakończenie programu, np. jako skut funkcji abort;
SIGFPE
SIGILL
błąd arytmetyczny, np. dzielenie przez zero lub nadmiar; zła postać funkcji, np. nielegalna instrukcja;
SIGINT ingerencja użytkownika, np. przerwanie;
SIGSEGV nielegalne odwołanie do pamięci, np. sięgnięcie poza przydzielony
obszar;
SIGTERM żądanie zakończenia przesłane do programu.
Funkcja signal zwraca poprzednią wartość argumentu handler dla danego sygnału lub SIG_ERR w przypadku błędu.
Jeśli teraz wystąpi sygnał sig, to najpierw przywraca się domyślną akcję dla tego sygnału, a następnie wywołuje wskazaną funkcję obsługi tak, jakby nastąpiło wywołanie (*handler)(sig). Po powrocie z funkcji obsługi program będzie wznowiony w miejscu, w którym nastąpiło przerwanie sygnałem.
Początkowy stan sygnałów zależy od implementacji, int raise(int sig)
Funkcja raise wysyła do programu sygnał sig; w przypadku niepowodzenia zwraca wartość różną od zera.
W nagłówku <time.h> znajdują się deklaracje typów i funkcji służących do obsługi daty i czasu. Niektóre funkcje operują czasem lokalnym, który może być różny od czasu kalendarzowego na skutek np. różnicy stref czasowych. Typy clock_t i time_t są typami arytmetycznymi reprezentującymi czas, a struktura struct tm mieści w sobie składniki czasu kalendarzowego:
int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst;
sekundy, które upłynęły po minucie (0, 61) minuty, które upłynęły po godzinie (0, 59) godziny, które upłynęły od północy (0, 23) dzień miesiąca (1, 31) miesiące, które upłynęły od stycznia (0, 11) lata, które upłynęły od 1900 r. dni, które upłynęły od niedzieli (0, 6) dni, które upłynęły od 1 stycznia (0, 365) znacznik letniej zmiany czasu
Znacznik tm_isdst jest dodatni, gdy obowiązuje czas letni; zero - gdy nie obowiązuje, i ujemny - w przypadku braku takiej informacji.
341