Signaali (tietotekniikka)

Kohteesta Wikipedia
Loikkaa: valikkoon, hakuun

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 signaalikäsittelyn ajaksi. Ohjelma voi toteuttaa signaalinkäsittelijäfunktion, jota kutsutaan oletustoteutuksen sijaan.

Esimerkki[muokkaa | muokkaa wikitekstiä]

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.

Lähteet[muokkaa | muokkaa wikitekstiä]

Aiheesta muualla[muokkaa | muokkaa wikitekstiä]

Tämä tietotekniikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.