Signaali (tietotekniikka)

Signaali on tietotekniikassa ohjelmallinen keskeytys. Signaaleja käytetään Unixeissa, Unixin kaltaisissa ja POSIX-yhteensopivissa käyttöjärjestelmissä asynkronisien tapahtumien välittämiseen.

Varhaisissa BSD ja AT&T -versioissa signaalit olivat epäyhteensopivia ja epäluotettavia. POSIX.1:stä lähtien käytössä on ollut standardoitu luotettava mekanismi signaalien välitykseen.

Esimerkkejä signaaleista ovat SIGKILL (ohjelman lopettaminen) ja SIGSEGV (muistiviittausvirhe). Tyypillisiä käyttäjän määrittämiä signaaleja ovat SIGUSR1 ja SIGUSR2.

Signaalin välittäminen ohjelmalle keskeyttää ohjelman suorituksen signaalin käsittelyn ajaksi. Ohjelma voi toteuttaa signaalinkäsittelijäfunktion, jota kutsutaan oletustoteutuksen sijaan.

Esimerkki 
Yksinkertainen esimerkki signaalin käsittelystä sovellusohjelmassa:
#include <signal.h>

int g_stop = 0;
void s_handler(int signo)
{
    g_stop = 1; /* triviaali toiminto signaalin käsittelemiseksi */
}

int main()
{
    if (signal(SIGUSR1, s_handler) < 0) /* aseta käsittelijäfunktio signaalille SIGUSR1 */
    {
         return -1;
    }
    while (g_stop == 0) /* tarkista.. */
    {
         sleep(100); /* ..odota */
    }
    return 0;
}

Esimerkissä s_handler() on funktio, jota kutsutaan kun prosessille välitetään signaali SIGUSR1. Käsittelijäfunktio ja signaalitunniste liitetään funktiolla signal().

Signaali voidaan antaa prosessille komennolla kill -SIGUSR1 pid, jossa pid on prosessin tunnistenumero. Huomaa, että ohjelman pääsäie on odottamassa toistorakenteessa normaalin suorituksen ajan eikä kutsu käsittelijää itse suoraan lainkaan.

POSIX-yhteensopivissa alustoissa on tyypillisesti pause() -funktio, jolla ohjelman suorituksen voi pysäyttää kunnes sille välitetään signaali.

Ongelmatilanteet 
Signaalikonseptissa on mahdollista syntyä kilpatilanne, jossa prosessin tunnusnumero (ID) käytetään uudestaan eri prosessille. Linuxiin on esitetty eri ratkaisuvaihtoehtoja toteutustavoille saman ongelman välttämiseen. Linux-ytimen versiossa 5.1 on lisätty pidfd-rajapinta ongelman ratkaisuksi.

Lähteet

Viitteet

Aiheesta muualla 
 The Open Groupin määritelmä 
 PAUSE(2) – Linux Programmer's Manual 
 The Linux Signals Handling Model Linux Journalin verkkosivuilla 

Käyttöjärjestelmätekniikka
Unix