.\" -*- coding: UTF-8 -*-
'\" t
.\" Copyright (C) 2016 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: GPL-2.0-or-later
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH setjmp 3 "16 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.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 <setjmp.h>\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<setjmp.h>\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 <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.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 .
