setjmp(3) Library Functions Manual setjmp(3) NAZWA setjmp, sigsetjmp, longjmp, siglongjmp - przeprowadza nielokalne goto BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int setjmp(jmp_buf env); int sigsetjmp(sigjmp_buf env, int savesigs); [[noreturn]] void longjmp(jmp_buf env, int val); [[noreturn]] void siglongjmp(sigjmp_buf env, int val); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): setjmp(): patrz HISTORIA. sigsetjmp(): _POSIX_C_SOURCE OPIS Funkcje opisane w niniejszym podreczniku sluza do wykonywania ,,nielokalnych goto": przeniesienia wykonania z jednej funkcji, do okreslonego wczesniej polozenia w innej funkcji. Funkcja setjmp() dynamicznie okresla cel, do ktorego zostanie nastepnie przeniesiona kontrola, a longjmp() dokonuje przeniesienia wykonania. Funkcja setjmp() zapisuje rozne informacje o srodowisku wywolujacego (zwykle wskaznik stosu, wskaznik instrukcji, ewentualnie wartosci innych rejestrow oraz maske sygnalow) w buforze env, do pozniejszego uzytku przez longjmp(). W tym przypadku, setjmp() zwraca 0. Funkcja longjmp() uzywa informacji zapisanych w env do ponownego przeniesienia kontroli do miejsca, z ktorego wywolano setjmp() i przywrocenia (,,przewiniecia wstecz") stosu, do jego stanu w momencie wywolania setjmp(). Dodatkowo, w zaleznosci od implementacji (zob. UWAGI i HISTORIA), wartosci niektorych innych rejestrow i maska sygnalow procesu moga byc przywrocone do ich stanu z chwili wywolania setjmp(). Po pomyslnym longjmp(), wykonanie kontynuuje, jak gdyby setjmp() powrocilo drugi raz. Ten ,,udawany" powrot mozna rozroznic od prawdziwego wywolania setjmp(), poniewaz ,,udawany" powrot zwraca wartosc przekazana w val. Jesli programista omylkowo poda w val wartosc 0, to ,,udawany" powrot zwroci w zamian 1. sigsetjmp() i siglongjmp() sigsetjmp() i siglongjmp() rowniez wykonuja nielokalne goto, lecz zapewniaja przewidywalna obsluge maski sygnalow procesu. Wtedy, i tylko wtedy, gdy argument savesigs przekazany do sigsetjmp jest niezerowy, biezaca maska sygnalow procesu jest zachowywana w env i zostanie odtworzona przez pozniejsze wykonanie siglongjmp() z tym samym env. WARTOSC ZWRACANA Przy bezposrednim wywolaniu, setjmp() i sigsetjmp() zwracaja 0; przy ,,udawanym" powrocie, ktory nastepuje po longjmp() lub siglongjmp(), zwracana jest wartosc niezerowa przekazana w val. Funkcje longjmp() i siglongjmp() nie powracaja. ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +---------------------------+--------------------------+---------------+ |Interfejs | Atrybut | Wartosc | +---------------------------+--------------------------+---------------+ |setjmp(), sigsetjmp() | Bezpieczenstwo watkowe | MT-bezpieczne | +---------------------------+--------------------------+---------------+ |longjmp(), siglongjmp() | Bezpieczenstwo watkowe | MT-bezpieczne | +---------------------------+--------------------------+---------------+ STANDARDY setjmp() longjmp() C11, POSIX.1-2008. sigsetjmp() siglongjmp() POSIX.1-2008. HISTORIA setjmp() longjmp() POSIX.1-2001, C89. sigsetjmp() siglongjmp() POSIX.1-2001. POSIX nie okresla, czy setjmp() zapisze maske sygnalow (do pozniejszego jej przywrocenia w trakcie longjmp()). W Systemie V nie ma to miejsca. W 4.3BSD tak sie dzieje, wystepuje rowniez funkcja _setjmp(), ktora tego nie robi. Zachowanie w Linuksie zalezy od wersji glibc i ustawienia makra sprawdzania cech. Przed glibc 2.19, setjmp() nasladuje domyslnie zachowanie Systemu V, a zachowanie BSD jest zapewniane, jesli makro sprawdzania cech _BSD_SOURCE jest jawnie zdefiniowane, a zadne z: _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _GNU_SOURCE, ani _SVID_SOURCE nie jest zdefiniowane. Od glibc 2.19, ujawnia jedynie wersje Systemu V setjmp(). Programy potrzebujace semantyki BSD powinny zastapic wywolania do setjmp(), wywolaniami sigsetjmp() z niezerwoym argumentem savesigs. UWAGI setjmp() i longjmp() moga byc przydatne do radzenia sobie z bledami w gleboko zagniezdzonych wywolaniach funkcji albo do umozliwienia procedurze obslugi sygnalu do przekazania kontroli do okreslonego punktu programu, zamiast do powracania do punktu, gdzie procedura obslugi przerwala glowny program. W tym drugim przypadku, jesli chce sie zachowac i przywrocic maski sygnalow w sposob przenosny, nalezy korzystac z sigsetjmp() i siglongjmp(). Zob. tez opis na temat czytelnosci programu ponizej. ZASTRZEZENIA Kompilator moze dokonac optymalizacji zmiennych do rejestrow, a longjmp() moze przywrocic wartosci innych rejestrow oprocz wskaznika stosu i licznika programu. Co za tym idzie, wartosci automatycznych zmiennych sa nieokreslone po wywolaniu longjmp(), jesli zostana spelnione wszystkie ponizsze kryteria: o sa lokalne w stosunku do funkcji, ktora wykonala odpowiednie wywolanie setjmp(); o ich wartosci sa zmienione pomiedzy wywolaniami do setjmp() i longjmp(); i o nie sa zadeklarowane jako volatile (ulotne). Te same uwagi stosuja sie do siglongjmp(). Nielokalne goto i czytelnosc programu Choc moze byc naduzywane, tradycyjne wyrazenie ,,goto" jezyka C korzysta przynajmniej ze wskazowek leksykalnych (wyrazenie goto i docelowa etykieta), co pozwala programiscie latwo wyczuc przeplyw kontroli. Nielokalne goto nie zapewniaja takich wskazowek, tej samej zmiennej jmp_buf moze uzywac wiele wywolan setjmp(), tak wiec zawartosc zmiennej moze sie zmieniac w trakcie istnienia aplikacji. Co za tym idzie, programista moze byc zmuszony do szczegolowej analizy kodu, aby okreslic dynamiczny cel danego wywolania longjmp() (aby ulatwic zycie programiscie, kazde wywolanie setjmp() powinno miec unikatowa zmienna jmp_buf). Dodatkowa trudnosc stanowi fakt, ze wywolania setjmp() i longjmp() nie musza byc nawet w tym samym module kodu zrodlowego. Podsumowujac, nielokalne goto powoduja, ze programy sa trudne do zrozumienia i utrzymywania, zatem jesli jest to mozliwe, nalezy uzywac innych rozwiazan. Niezdefiniowane zachowanie Jesli funkcja, ktora wywolala setjmp() powroci przed wywolaniem longjmp(), zachodzi niezdefiniowane zachowanie. Na pewno wystapi, mniejszy lub wiekszy, chaos. Jesli w programie wielowatkowym, wywolanie longjmp() uzyje bufora env, ktory byl zainicjowany wywolaniem setjmp() w innym watku, zachowanie jest niezdefiniowanie. POSIX.1-2008 Technical Corrigendum 2 dodaje longjmp() i siglongjmp() do listy funkcji async-signal-safe. Jednak standard zaleca unikania korzystania z tych funkcji z procedur obslugi sygnalu wskazujac, ze gdy funkcje te sa wywolywane z procedury obslugi sygnalu, ktory przerwal wywolanie do funkcji non-async-signal-safe (lub odpowiednika, np. ekwiwalentne kroki do exit(3), ktore zachodza przy powrocie z pierwotnego wywolania do main()), zachowanie jest niezdefiniowane, gdy program wykona nastepnie wywolanie do funkcji non-async-signal-safe. Jedynym sposobem unikniecia niezdefiniowanego zachowania jest zapewnienie jednego z ponizszych: o Po dlugim skoku z pierwotnej procedury obslugi sygnalu, program nie wywoluje zadnych funkcji non-async-signal-safe i nie powraca z pierwotnego wywolania do main(). o Wszelkie sygnaly, ktorych procedury obslugi wykonuja dlugi skok, musza byc blokowane w trakcie kazdego wywolania do funkcji non-async-signal-safe i zadna funkcja non-async-signal-safe nie moze byc wywolana po powrocie z pierwotnego wywolania do main(). ZOBACZ TAKZE signal(7), signal-safety(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.17 8 lutego 2026 r. setjmp(3)