signal(2)

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

signal(2)

Systemanrop Manual

NAMN

signal - ANSI C signalhantering

BIBLIOTEK

Standard C-biblioteket (libc, -lc)

SYNOPSIS

```c

  1. include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler); ```

BESKRIVNING

VARNING: Beteendet för `signal()` varierar mellan UNIX-versioner och har också varierat historiskt över olika versioner av Linux. Undvik att använda det: använd sigaction(2) istället. Se Portabilitet nedan.

`signal()` ställer in signaldestinationen för signalen `signum` till `handler`, som kan vara:

  • `SIG_IGN` - Ignorera signalen.
  • `SIG_DFL` - Återställ standardåtgärden för signalen (se signal(7)).
  • Adressen till en programmerardefinierad funktion (en "signalhanterare").

Om signalen `signum` levereras till processen händer något av följande:

  • Om destinationen är `SIG_IGN` ignoreras signalen.
  • Om destinationen är `SIG_DFL` utförs standardåtgärden för signalen.
  • Om destinationen är en funktion utförs signalhanteraren med argumentet `signum`. När signalhanteraren returnerar avblockeras signalen om den tidigare blockerades.

Signalerna `SIGKILL` och `SIGSTOP` kan inte fångas eller ignoreras.

RETURNERAT VÄRDE

`signal()` returnerar det tidigare värdet av signalhanteraren. Vid fel returneras `SIG_ERR` och `errno` sätts för att indikera felet.

FEL

  • `EINVAL` - Ogiltig signal `signum`.

VERSIONER

Användningen av `sighandler_t` är en GNU-förlängning som aktiveras om `_GNU_SOURCE` är definierad. Utan denna typ måste deklarationen av `signal()` skrivas som:

```c void (*signal(int signum, void (*handler)(int)))(int); ```

Portabilitet

Den enda portabla användningen av `signal()` är att ställa in en signals destination till `SIG_DFL` eller `SIG_IGN`. Semantiken för att använda `signal()` för att etablera en signalhanterare varierar mellan system. Använd istället sigaction(2) för detta ändamål.

STANDARDER

C11, POSIX.1-2008.

HISTORIK

C89, POSIX.1-2001.

På de ursprungliga UNIX-systemen återställdes signalhanterarens destination till `SIG_DFL` efter att signalen levererats. Detta beteende var problematiskt eftersom signalen kunde levereras igen innan hanteraren kunde återetableras.

BSD förbättrade situationen genom att blockera signalen under signalhanterarens körning och återstarta avbrutna systemanrop (se signal(7)). I Linux använder `signal()` som standard BSD-semantik via ett omslagsanrop till sigaction(2).

NOTER

  • Effekterna av `signal()` i en multitrådad process är ospecificerade.
  • Att ignorera signaler som `SIGFPE`, `SIGILL` eller `SIGSEGV` som inte genererats av kill(2) eller raise(3) kan leda till odefinierat beteende.
  • Se signal-safety(7) för en lista över funktioner som säkert kan anropas från en signalhanterare.

SE ÄVEN

COLOPHON

Denna manual är en del av Linux manualprojektet. Rapportera buggar till ⟨man-pages@man7.org⟩.

Sidslut

Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man2/signal.2.html
PHP


Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till PC Service som har sponsrat Linux.se med webbhotell.