signal(7)

Från Wiki.linux.se
Version från den 21 november 2024 kl. 08.28 av Admin (diskussion | bidrag)
Hoppa till navigering Hoppa till sök

signal(7)

Översikt över signaler

NAMN

signal - översikt över signaler

BESKRIVNING

Linux stödjer både POSIX-reliabla signaler (hädanefter "standardsignaler") och POSIX realtidssignaler.

Signaldestinationer

Varje signal har en nuvarande destination, som avgör hur processen beter sig när signalen levereras.

Tabellen nedan visar de möjliga standarddestinationerna för varje signal:

  • Term - Standardåtgärden är att avsluta processen.
  • Ign - Standardåtgärden är att ignorera signalen.
  • Core - Standardåtgärden är att avsluta processen och generera en kärndump.
  • Stop - Standardåtgärden är att stoppa processen.
  • Cont - Standardåtgärden är att fortsätta processen om den för närvarande är stoppad.

En process kan ändra destinationen för en signal med hjälp av sigaction(2) eller signal(2).

Genom att använda dessa systemanrop kan en process välja en av följande åtgärder för levererade signaler:

  • Utföra standardåtgärden.
  • Ignorera signalen.
  • Fånga signalen med en signalhanterare, en programmerardefinierad funktion som körs automatiskt när signalen levereras.

Standarddestinationen för signalhanteraren körs på processens normala stack. Alternativt kan signalhanteraren använda en alternativ stack; se sigaltstack(2).

En signalhantering är en processattribut, vilket innebär att i en multitrådad applikation delar alla trådar samma signalhantering.

Barnprocesser skapade med fork(2) ärver förälderns signalhanteringar. Under en execve(2) återställs hanterade signaler till standard, medan ignorerade signaler förblir oförändrade.

Skicka en signal

Följande anrop kan användas för att skicka signaler:

  • raise(3) - Skickar en signal till den anropande tråden.
  • kill(2) - Skickar en signal till en specifik process eller processgrupp.
  • pidfd_send_signal(2) - Skickar en signal till en process via en PID-filbeskrivare.
  • pthread_kill(3) - Skickar en signal till en specifik POSIX-tråd.
  • sigqueue(3) - Skickar en realtidsignal med bifogade data till en specifik process.

Vänta på att en signal fångas

Följande systemanrop pausar trådens körning tills en signal fångas:

  • pause(2) - Pausar tills en signal fångas.
  • sigsuspend(2) - Temporärt ändrar signalmasken och pausar tills en oskyddad signal fångas.

Synkron hantering av signaler

Signaler kan hanteras synkront med följande metoder:

Signalblockering och köade signaler

En signal kan blockeras, vilket innebär att den inte levereras förrän den avblockeras. Signaler som är genererade men ännu inte levererade kallas "väntande signaler".

Varje tråd har en oberoende signalmask, som kan ändras med pthread_sigmask(3) i multitrådade applikationer. I en entrådad applikation kan sigprocmask(2) användas för att manipulera signalmasken.

Utförande av signalhanterare

När en signalhanterare aktiveras: 1. Signalen tas bort från de väntande signalerna. 2. Om `SA_ONSTACK` används, byter tråden till en alternativ signalstack. 3. Signalrelaterad kontext sparas, inklusive:

  * Programräknarens position (nästa instruktion som ska köras när signalhanteraren avslutas).
  * Trådens aktuella signalmask.
  * Konfiguration av trådens alternativa signalstack.

4. Körningen överförs till signalhanteraren. 5. När signalhanteraren returnerar, återställer sigreturn(2) trådens tillstånd till det som gällde innan signalen fångades.

STANDARDSIGNALER

Linux stödjer följande standardsignaler. Tabellen visar standardåtgärden för varje signal och om den är definierad av POSIX:

Signal Standard Åtgärd Kommentar
SIGABRT POSIX Core Abortsignal från abort(3) SIGALRM POSIX Term Timersignal från alarm(2) SIGBUS POSIX Core Minnesfel SIGCHLD POSIX Ign Barnprocess stoppad eller avslutad SIGCONT POSIX Cont Fortsätt om stoppad SIGFPE POSIX Core Flyttalsfel SIGILL POSIX Core Otillåten instruktion SIGINT POSIX Term Avbrott från tangentbord SIGKILL POSIX Term Döda process (kan inte fångas) SIGPIPE POSIX Term Skriva till trasig rörledning SIGSEGV POSIX Core Ogiltig minnesreferens SIGTERM POSIX Term Avslutningssignal SIGUSR1 POSIX Term Användardefinierad signal 1 SIGUSR2 POSIX Term Användardefinierad signal 2

Signaler som SIGKILL och SIGSTOP kan inte fångas, blockeras eller ignoreras.

REALTIDSSIGNALER

Linux stödjer realtidssignaler, som har följande egenskaper:

  • Realtidssignaler har inga fördefinierade betydelser.
  • Realtidssignaler kan köas, till skillnad från standardsignaler.
  • Realtidssignaler levereras i den ordning de genereras.

Realtidssignaler används för applikationsspecifika ändamål. Program bör alltid referera till realtidssignaler som `SIGRTMIN+n` och kontrollera att `SIGRTMIN+n` inte överskrider `SIGRTMAX`.

SYSTEMANROP OCH BIBLIOTEKSFUNKTIONER

Om en signal fångas medan ett systemanrop eller en biblioteksfunktion är blockerad kan anropet:

  • Startas om automatiskt efter att signalhanteraren returnerar.
  • Avbrytas och returnera felet `EINTR`.

Vilket som händer beror på om signalhanteraren skapades med flaggan `SA_RESTART`. För detaljer, se sigaction(2).

STANDARDER

Signalhantering följer POSIX.1.

NOTER

Se signal-safety(7) för en diskussion om säkra funktioner vid signalhantering.

BUGGAR

Signaler som SIGBUS och SIGSEGV kan levereras olika beroende på CPU-arkitektur.

SE ÄVEN

COLOPHON

Denna manual är en del av Linux manualprojektet. För att rapportera buggar, kontakta ⟨man-pages@man7.org⟩.