Siirry sisältöön

C/Standardikirjastot/signal.h

Wikikirjastosta
#include <signal.h>

Sisältää signaalien käsittelyyn liittyviä toimintoja. Signaalit ovat ohjelmille annettavia sanomia, jotka keskeyttävät ohjelman suorituksen, kunnes ne on käsitelty. Ne voivat myös johtaa ohjelman kaatumiseen, jos niitä ei käsitellä.

C-standardin signaalikirjasto on huomattavasti pienempi kuin esimerkiksi POSIX-standardin.

sig_atomic_t

on kokonaislukutyyppi, jonka voi lukea ja kirjoittaa kerralla ilman, että signaalinkäsittelijä voi keskeyttää lukua tai kirjoitusta kesken kaiken. Tyyppi ei silti välttämättä ole atominen esim. monisäikeisissä ohjelmissa, vaikka tietotyyppiä käytetäänkin ajoittain näin väärin.

SIG_DFL
SIG_ERR
SIG_IGN

ovat arvoja, jotka sopivat signal-funktion toiseksi argumentiksi (paitsi SIG_ERR), ja jotka signal-funktio voi myös palauttaa.

SIGABRT       /* aiheutuu, kun ohjelman suoritus keskeytyy odottamattomasti; stdlib.h:n abort() aiheuttaa tämän signaalin */
SIGFPE        /* aiheutuu, kun laskutoimitus johtaa poikkeukseen, esim. nollalla jakaminen */
SIGILL        /* aiheutuu, kun ohjelma yrittää suorittaa kelvotonta suoritinkäskyä */
SIGINT        /* aiheutuu, kun käyttäjä ilmaisee, että haluaa ohjelman keskeyttävän suorituksensa (yleensä Ctrl+C -näppäinyhdistelmällä) */
SIGSEGV       /* aiheutuu, kun ohjelma yrittää käyttää muistia, johon sillä ei ole pääsyä */
SIGTERM       /* aiheutuu, kun järjestelmä vaatii ohjelmaa keskeyttämään toimintansa */

ovat signaaleja. Alusta voi määritellä enemmänkin, mutta C-standardi vaatii nämä.

void (*signal(int signaali, void (*funktio)(int)))(int);

(signal on funktio, joka ottaa parametrit int signaali ja void (*funktio)(int)), ja palauttaa funktio-osoittimen void (*palautettu_funktio)(int)); ks. Funktio-osoittimet)

korvaa signaalinkäsittelijän mainitulle signaalille. Niin toinen argumentti funktio kuin myöskin palautettu arvo voi myös olla yksi seuraavista:

SIG_DFL       /* käsittele signaali oletuskäsittelijällä */
SIG_IGN       /* älä käsittele signaalia ollenkaan; jätä se huomiotta */

Jos signaalinkäsittelijä ei ole edellä mainittu arvo, sen on oltava funktio, joka ottaa yhden kokonaislukuparametrin (argumentiksi annetaan signaalin numero) eikä palauta mitään. Käsittelijää voidaan kutsua milloin tahansa, joten se ei saa tehdä aivan mitä tahansa. Se ei saa esimerkiksi kutsua mitään standardikirjaston funktiota lukuun ottamatta seuraavia:

  • signal (ensimmäisen argumentin on oltava sama kuin signaalinkäsittelijälle annettu argumentti)
  • abort
  • [C99] _Exit

Signaalinkäsittelijä ei saa myöskään lukea käsittelijän ulkopuolelta (tai staattista muuttujaa käsittelijän sisällä) arvoa, jonka koko on suurempi kuin sig_atomic_t:n, taikka kirjoittaa sellaista arvoa funktion ulkopuolelle (tai staattiseen muuttujaan käsittelijän sisällä).

Nämä rajoitukset voivat olla alustasta riippuen löyhempiä. Signaalinkäsittelijän koodilla on joka tapauksessa usein jonkinlaisia rajoituksia. Esimerkiksi POSIX-standardi määrittelee luettelon "turvallisista" funktioista, joita saa käyttää signaalinkäsittelijän koodissa. Mitään dynaamiseen muistiin liittyvää (varauksia tai niiden vapauttamisia) ei kuitenkaan voi käytännössä koskaan tehdä signaalinkäsittelijän sisällä.

signal voi myös palauttaa arvon SIG_ERR, joka ilmaisee, että tapahtui jonkinlainen virhe. Muussa tapauksessa signal palauttaa arvon, jonka voi antaa sille takaisin palauttaakseen sen signaalinkäsittelijän, joka oli käytössä ennen ensimmäistä kutsua.

int raise(int signaali);

aiheuttaa annetun signaalin. Jos signaali aiheutettiin onnistuneesti, palauttaa nollan, ja muuten muun arvon.