SIGRETURN(2) Linux Programmeurs Handleiding SIGRETURN(2)

sigreturn, rt_sigreturn - keer terug uit signaal verwerker en maak de stapel schoon

int sigreturn(...);

Als de Linux kernel detecteert dat een niet-geblokkeerd signaal in afwachting is van een proces, dan, zal bij de volgende overgang terug naar de gebruikers mode van dat process (b.v. bij terugkeer van een systeem aanroep of wanneer het proces werd verplaatst naar de CPU), het een nieuw frame aanmaken op de stapel van de gebruiker-ruimte waarin het diverse onderdelen van de proces context bewaard (processor status woord, registers, signaal masker en signaal instellingen).

De kernel zorgt er ook voor dat bij de terugkeer naar de gebruikers mode, dat de signaal verwerker wordt aangeroepen, en dat, bij terugkeer uit de verwerker, de controle wordt doorgegeven naar een onderdeel van de gebruikers-ruimte code, veelal aangeduid als "de signaal trampoline". De signaal trampoline code op zijn beurt roept signreturn() aan.

Deze sigreturn() aanroep maakt alles ongedaan dat was gedaan\mveranderen van het proces signaal masker, veranderen van signaal stapel (zie signmalstack(2))\mom de signaal verwerker aan te roepen. Gebruik makend van de informatie die eerder werd bewaard op de stack van de gebruikers-ruimte herstelt sigreturn() het masker van het signaal van het proces, schakelt tussen stapels, en herstelt de processor context (processor vlaggen en registers, inclusief de stapel- en instructie wijzers), zodat het proces de executie hervat vanaf het punt waar het werd onderbroken door het signaal .

sigreturn() keert nooit terug.

Veel UNIX-achtige systemen hebben een sigreturn() systeem aanroep of een bijna equivalent. Echter, deze aanroep is niet gespecificeerd in POSIX en details van zijn gedrag variëren van systeem tot systeem.

sigreturn() bestaat alleen om de implementatie van signaal verwerkers mogelijk te maken. Hij moet nooit direct aangeroepen worden. (Inderdaad, een eenvoudige sigreturn() omwikkel functie in de GNU C-bibliotheek retourneert eenvoudigweg -1, met errno gezet op ENOSYS.) Details over de argumenten (als er al een is) meegegeven aan sigreturn() variëren afhankelijk van de architectuur. (Op sommige architecturen, zoals de x86-64 heeft sigreturn() geen argument, omdat alle benodigde informatie beschikbaar is op de stapel die eerder werd gecreëerd door de kernel op de stapel in de gebruikers-ruimte.

Ooit plaatsten UNIX systemen de code van de signaal trampoline op de gebruiker stapel. Tegenwoordig worden pagina´s van de gebruiker stapel beschermd tegen het uitvoeren van code. Op hedendaagse Linux systemen leeft daarom, afhankelijk van de architectuur, de signaal trampoline code ofwel in de vdso(7) of in de C-bibliotheek. In het laatste geval informeert de bibliotheek sigaction(2) omwikkel functie de kernel over de locatie van de trampoline code door het plaatsen van het adres in het sa_restorer veld van de sigaction structure, en zet de SA_RESTORER vlag in het sa_flags veld.

De opgeslagen proces context informatie wordt geplaatst in een ucontext_t structure (zie <sys/ucontext.h>). Deze structure is zichtbaar in de signaal verwerker als het derde argument van de verwerker zoals gevestigd door sigaction(2) met de SA_SIGINFO vlag.

Op een aantal andere UNIX systemen, verschilt de werking van de signaal trampoline een beetje. In het bijzonder, op sommige systemen zal de kernel bij de terugkeer uit gebruiker mode, de controle doorgeven naar de trampoline (in plaats van de signaal verwerker), en de trampoline code roept de signaal verwerker aan (en roept vervolgens sigreturn() aan wanneer de verwerker terugkeert).

De originele Linux systeem aanroep heette sigreturn(). Echter, na de toevoeging van echt-tijd signalen in Linux 2.2, werd een nieuwe systeem aanroep, rt_sigreturn() toegevoegd om een vergroot sigset_t type te ondersteunen. De GNU C bibliotheek verbergt deze details voor ons, daarbij transparant gebruikmakend van rt_sigreturn() wanneer de kernel hierin voorziet.

kill(2), restart_syscall(2), sigaltstack(2), signal(2), getcontext(3), signal(7), vdso(7)

Deze pagina is onderdeel van release 5.13 van het Linux man-pages-project. Een beschrijving van het project, informatie over het melden van bugs en de nieuwste versie van deze pagina zijn op https://www.kernel.org/doc/man-pages/ te vinden.

De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.

22 maart 2021 Linux