.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2016, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH setjmp 3 "8 lutego 2026 r." "Linux man\-pages 6.18" .SH NAZWA setjmp, sigsetjmp, longjmp, siglongjmp \- przeprowadza nielokalne goto .SH BIBLIOTEKA Standardowa biblioteka C (\fIlibc\fP,\ \fI\-lc\fP) .SH SKŁADNIA .nf \fB#include \fP .P \fBint setjmp(jmp_buf \fP\fIenv\fP\fB);\fP \fBint sigsetjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIsavesigs\fP\fB);\fP .P \fB[[noreturn]] void longjmp(jmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP \fB[[noreturn]] void siglongjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP .fi .P .RS -4 Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)): .RE .P \fBsetjmp\fP(): patrz HISTORIA. .P \fBsigsetjmp\fP(): .nf _POSIX_C_SOURCE .fi .SH OPIS Funkcje opisane w niniejszym podręczniku służą do wykonywania \[Bq]nielokalnych goto\[rq]: przeniesienia wykonania z jednej funkcji, do określonego wcześniej położenia w innej funkcji. Funkcja \fBsetjmp\fP() dynamicznie określa cel, do którego zostanie następnie przeniesiona kontrola, a \fBlongjmp\fP() dokonuje przeniesienia wykonania. .P Funkcja \fBsetjmp\fP() zapisuje różne informacje o środowisku wywołującego (zwykle wskaźnik stosu, wskaźnik instrukcji, ewentualnie wartości innych rejestrów oraz maskę sygnałów) w buforze \fIenv\fP, do późniejszego użytku przez \fBlongjmp\fP(). W tym przypadku, \fBsetjmp\fP() zwraca 0. .P Funkcja \fBlongjmp\fP() używa informacji zapisanych w \fIenv\fP do ponownego przeniesienia kontroli do miejsca, z którego wywołano \fBsetjmp\fP() i przywrócenia (\[Bq]przewinięcia wstecz\[rq]) stosu, do jego stanu w momencie wywołania \fBsetjmp\fP(). Dodatkowo, w zależności od implementacji (zob. UWAGI i HISTORIA), wartości niektórych innych rejestrów i maska sygnałów procesu mogą być przywrócone do ich stanu z chwili wywołania \fBsetjmp\fP(). .P Po pomyślnym \fBlongjmp\fP(), wykonanie kontynuuje, jak gdyby \fBsetjmp\fP() powróciło drugi raz. Ten \[Bq]udawany\[rq] powrót można rozróżnić od prawdziwego wywołania \fBsetjmp\fP(), ponieważ \[Bq]udawany\[rq] powrót zwraca wartość przekazaną w \fIval\fP. Jeśli programista omyłkowo poda w \fIval\fP wartość 0, to \[Bq]udawany\[rq] powrót zwróci w zamian 1. .SS "sigsetjmp() i siglongjmp()" \fBsigsetjmp\fP() i \fBsiglongjmp\fP() również wykonują nielokalne goto, lecz zapewniają przewidywalną obsługę maski sygnałów procesu. .P Wtedy, i tylko wtedy, gdy argument \fIsavesigs\fP przekazany do \fBsigsetjmp\fP jest niezerowy, bieżąca maska sygnałów procesu jest zachowywana w \fIenv\fP i zostanie odtworzona przez późniejsze wykonanie \fBsiglongjmp\fP() z tym samym \fIenv\fP. .SH "WARTOŚĆ ZWRACANA" Przy bezpośrednim wywołaniu, \fBsetjmp\fP() i \fBsigsetjmp\fP() zwracają 0; przy \[Bq]udawanym\[rq] powrocie, który następuje po \fBlongjmp\fP() lub \fBsiglongjmp\fP(), zwracana jest wartość niezerowa przekazana w \fIval\fP. .P Funkcje \fBlongjmp\fP() i \fBsiglongjmp\fP() nie powracają. .SH ATRYBUTY Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interfejs Atrybut Wartość T{ .na .nh \fBsetjmp\fP(), \fBsigsetjmp\fP() T} Bezpieczeństwo wątkowe MT\-bezpieczne T{ .na .nh \fBlongjmp\fP(), \fBsiglongjmp\fP() T} Bezpieczeństwo wątkowe MT\-bezpieczne .TE .SH STANDARDY .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() C11, POSIX.1\-2008. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2008. .SH HISTORIA .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() POSIX.1\-2001, C89. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2001. .P .\" so that _FAVOR_BSD is triggered .\" .BR _XOPEN_SOURCE_EXTENDED , POSIX nie określa, czy \fBsetjmp\fP() zapisze maskę sygnałów (do późniejszego jej przywrócenia w trakcie \fBlongjmp\fP()). W Systemie V nie ma to miejsca. W 4.3BSD tak się dzieje, występuje również funkcja \fB_setjmp\fP(), która tego nie robi. Zachowanie w Linuksie zależy od wersji glibc i ustawienia makra sprawdzania cech. Przed glibc 2.19, \fBsetjmp\fP() naśladuje domyślnie zachowanie Systemu V, a zachowanie BSD jest zapewniane, jeśli makro sprawdzania cech \fB_BSD_SOURCE\fP jest jawnie zdefiniowane, a żadne z: \fB_POSIX_SOURCE\fP, \fB_POSIX_C_SOURCE\fP, \fB_XOPEN_SOURCE\fP, \fB_GNU_SOURCE\fP, ani \fB_SVID_SOURCE\fP nie jest zdefiniowane. Od glibc 2.19, \fI\fP ujawnia jedynie wersję Systemu V \fBsetjmp\fP(). Programy potrzebujące semantyki BSD powinny zastąpić wywołania do \fBsetjmp\fP(), wywołaniami \fBsigsetjmp\fP() z niezerwoym argumentem \fIsavesigs\fP. .SH UWAGI \fBsetjmp\fP() i \fBlongjmp\fP() mogą być przydatne do radzenia sobie z błędami w głęboko zagnieżdżonych wywołaniach funkcji albo do umożliwienia procedurze obsługi sygnału do przekazania kontroli do określonego punktu programu, zamiast do powracania do punktu, gdzie procedura obsługi przerwała główny program. W tym drugim przypadku, jeśli chce się zachować i przywrócić maski sygnałów w sposób przenośny, należy korzystać z \fBsigsetjmp\fP() i \fBsiglongjmp\fP(). Zob. też opis na temat czytelności programu poniżej. .SH ZASTRZEŻENIA Kompilator może dokonać optymalizacji zmiennych do rejestrów, a \fBlongjmp\fP() może przywrócić wartości innych rejestrów oprócz wskaźnika stosu i licznika programu. Co za tym idzie, wartości automatycznych zmiennych są nieokreślone po wywołaniu \fBlongjmp\fP(), jeśli zostaną spełnione wszystkie poniższe kryteria: .IP \[bu] 3 są lokalne w stosunku do funkcji, która wykonała odpowiednie wywołanie \fBsetjmp\fP(); .IP \[bu] ich wartości są zmienione pomiędzy wywołaniami do \fBsetjmp\fP() i \fBlongjmp\fP(); i .IP \[bu] nie są zadeklarowane jako \fIvolatile\fP (ulotne). .P .\" Te same uwagi stosują się do \fBsiglongjmp\fP(). .SS "Nielokalne goto i czytelność programu" Choć może być nadużywane, tradycyjne wyrażenie \[Bq]goto\[rq] języka C korzysta przynajmniej ze wskazówek leksykalnych (wyrażenie goto i docelowa etykieta), co pozwala programiście łatwo wyczuć przepływ kontroli. Nielokalne goto nie zapewniają takich wskazówek, tej samej zmiennej \fIjmp_buf\fP może używać wiele wywołań \fBsetjmp\fP(), tak więc zawartość zmiennej może się zmieniać w trakcie istnienia aplikacji. Co za tym idzie, programista może być zmuszony do szczegółowej analizy kodu, aby określić dynamiczny cel danego wywołania \fBlongjmp\fP() (aby ułatwić życie programiście, każde wywołanie \fBsetjmp\fP() powinno mieć unikatową zmienną \fIjmp_buf\fP). .P Dodatkową trudność stanowi fakt, że wywołania \fBsetjmp\fP() i \fBlongjmp\fP() nie muszą być nawet w tym samym module kodu źródłowego. .P .\" Podsumowując, nielokalne goto powodują, że programy są trudne do zrozumienia i utrzymywania, zatem jeśli jest to możliwe, należy używać innych rozwiązań. .SS "Niezdefiniowane zachowanie" Jeśli funkcja, która wywołała \fBsetjmp\fP() powróci przed wywołaniem \fBlongjmp\fP(), zachodzi niezdefiniowane zachowanie. Na pewno wystąpi, mniejszy lub większy, chaos. .P .\" .\" The following statement appeared in versions up to POSIX.1-2008 TC1, .\" but is set to be removed in POSIX.1-2008 TC2: .\" .\" According to POSIX.1, if a .\" .BR longjmp () .\" call is performed from a nested signal handler .\" (i.e., from a handler that was invoked in response to a signal that was .\" generated while another signal was already in the process of being .\" handled), the behavior is undefined. Jeśli w programie wielowątkowym, wywołanie \fBlongjmp\fP() użyje bufora \fIenv\fP, który był zainicjowany wywołaniem \fBsetjmp\fP() w innym wątku, zachowanie jest niezdefiniowanie. .P .\" http://austingroupbugs.net/view.php?id=516#c1195 POSIX.1\-2008 Technical Corrigendum 2 dodaje \fBlongjmp\fP() i \fBsiglongjmp\fP() do listy funkcji async\-signal\-safe. Jednak standard zaleca unikania korzystania z tych funkcji z procedur obsługi sygnału wskazując, że gdy funkcje te są wywoływane z procedury obsługi sygnału, który przerwał wywołanie do funkcji non\-async\-signal\-safe (lub odpowiednika, np. ekwiwalentne kroki do \fBexit\fP(3), które zachodzą przy powrocie z pierwotnego wywołania do \fImain\fP()), zachowanie jest niezdefiniowane, gdy program wykona następnie wywołanie do funkcji non\-async\-signal\-safe. Jedynym sposobem uniknięcia niezdefiniowanego zachowania jest zapewnienie jednego z poniższych: .IP \[bu] 3 Po długim skoku z pierwotnej procedury obsługi sygnału, program nie wywołuje żadnych funkcji non\-async\-signal\-safe i nie powraca z pierwotnego wywołania do \fImain\fP(). .IP \[bu] Wszelkie sygnały, których procedury obsługi wykonują długi skok, muszą być blokowane w trakcie \fIkażdego\fP wywołania do funkcji non\-async\-signal\-safe i żadna funkcja non\-async\-signal\-safe nie może być wywołana po powrocie z pierwotnego wywołania do \fImain\fP(). .SH "ZOBACZ TAKŻE" \fBsignal\fP(7), \fBsignal\-safety\fP(7) .PP .SH TŁUMACZENIE Tłumaczenie niniejszej strony podręcznika: Przemek Borys , Andrzej Krzysztofowicz i Michał Kułach . .PP Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .